2012-02-14 68 views
9

Tôi đang vẽ đồ thị một số dữ liệu (hai dòng) và tôi muốn thay đổi kiểu đường cho các phần của các đường mà sự khác biệt giữa chúng có ý nghĩa thống kê. Vì vậy, trong hình dưới đây (bây giờ là một liên kết b/c chính sách chống thư rác không cho phép tôi đăng hình ảnh) Tôi muốn các dòng trông khác nhau (tức là đứt quãng) cho đến khi chúng bắt đầu hội tụ ở khoảng 35 ngày trục x.Thay đổi kiểu đường kẻ giữa matplotlib giữa đồ thị

line plot

Có cách nào để thực hiện việc này dễ dàng không? Tôi có các giá trị cho trục x, nơi có sự khác biệt đáng kể, tôi không rõ làm thế nào để thay đổi kiểu đường tại một số vị trí trục x nhất định.

+3

gì về việc hai lô mỗi đường cong? Một với tập đầu tiên của các điểm (trước khi các giá trị bắt đầu hội tụ) và sau đó một số khác với tập thứ hai. Chỉ cần thiết lập các lô để có cùng một phong cách (màu sắc, điểm đánh dấu, vv), ngoại trừ phong cách dòng! :) –

+0

Cảm ơn, tôi sẽ thử điều này. Tôi có một vài mảnh khác, nơi các dòng phân kỳ một lần nữa sau đó đi xe đạp vào và ra khỏi tầm quan trọng. Điều này có nghĩa là tôi sẽ có một loạt các lệnh cốt truyện, nhưng hy vọng tôi có thể sắp xếp nó ra. – Sceeerutinizer

+0

@ RicardoCardenes- Tôi đề nghị bạn đặt bình luận của bạn như một câu trả lời để nó có thể được upvoted/chấp nhận. Đó là cách đúng để làm điều đó :-) –

Trả lời

14

Edit: Tôi đã đã mở này và để lại, vì vậy tôi không để ý @ Câu trả lời của Ricardo. Bởi vì matplotlib sẽ chuyển đổi mọi thứ thành các mảng bất chấp, có nhiều cách hiệu quả hơn để thực hiện nó.

Ví dụ:

Chỉ cần vẽ hai đường khác nhau, một dòng có đường nét đứt nét và một đường khác với kiểu lót liền mạch.

Ví dụ:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y1 = 2 * x 
y2 = 3 * x 

xthresh = 4.5 
diff = np.abs(y1 - y2) 
below = diff < xthresh 
above = diff >= xthresh 

# Plot lines below threshold as dotted... 
plt.plot(x[below], y1[below], 'b--') 
plt.plot(x[below], y2[below], 'g--') 

# Plot lines above threshold as solid... 
plt.plot(x[above], y1[above], 'b-') 
plt.plot(x[above], y2[above], 'g-') 

plt.show() 

enter image description here

Đối với trường hợp chúng theo chu kỳ, sử dụng mảng đeo mặt nạ:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y1 = 2 * np.cos(x) 
y2 = 3 * np.sin(x) 

xthresh = 2.0 
diff = np.abs(y1 - y2) 
below = diff < xthresh 
above = diff >= xthresh 

# Plot lines below threshold as dotted... 
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y1), 'b--') 
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y2), 'g--') 

# Plot lines above threshold as solid... 
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y1), 'b-') 
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y2), 'g-') 

plt.show() 

enter image description here

+0

suy nghĩ về một cái gì đó như thế, nhưng bằng cách nào đó quyết định làm điều đó một cách phức tạp: D. Rất tốt :) –

+0

Vui vì tôi vừa mới làm mới điều này. Chỉ đang xem xét sử dụng một mảng bị che khuất. Rất hữu ích. Cảm ơn tất cả vì sự thấu hiểu. – Sceeerutinizer

+0

http://stackoverflow.com/questions/27082282/changing-line-style-for-certain-range-of-values-using-matplotlib – Ohm

3

Hãy nói rằng dữ liệu của bạn trên NumPy mảng dataset1dataset2 và bạn đã xác định threshold như tầm quan trọng của bạn

def group(data): 
    """Assumes that len(data) > 0""" 
    prev = 0 
    index = 1 
    value = data[0] 

    while (index < len(data)): 
     if data[index] != value: 
      yield (value, prev, index) 

      value = not value 
      prev = index 
     index += 1 

    yield (value, prev, index) 

diff = np.abs(dataset1 - dataset2) 
for significant, start, end in group(diff < threshold): 
    # Plot data from dataset1[start:end] and dataset2[start:end] 
    # Use the value in "significant" (True/False) to figure out 
    # The style 
+0

Tôi nghĩ tôi có thể làm ngắn hơn bằng cách sử dụng từ 'itertools', nhưng tôi đoán điều này là đủ tốt: P –

Các vấn đề liên quan