2012-02-14 58 views
9

我正在繪製一些數據(兩行),並且想要更改行間差異在統計上顯着的部分的線條樣式。因此,在下面的圖片中(現在鏈接b/c反垃圾郵件政策不允許我發佈圖片),我希望線條看起來不同(也許虛線),直到它們開始收斂到大約35 x軸。更改matplotlib線樣式中間圖

line plot

有沒有一種方法可以輕鬆地做到這一點?我有X軸的值在差異顯着,我只是不清楚如何更改某些X軸位置的線條樣式。

+3

約每曲線使兩個地塊是什麼?一個帶有第一組點(值開始收斂之前),然後是第二組。除了線條樣式,只需設置圖形具有相同的樣式(顏色,標記等)! :) – 2012-02-14 22:17:32

+0

謝謝,我會試試這個。我還有其他一些地塊,其中的線路稍後在循環進入和退出意義時再次發生分歧。這意味着我會有一堆劇情指令,但希望我能夠把它整理出來。 – Sceeerutinizer 2012-02-14 22:20:27

+0

@ RicardoCardenes-我建議你把你的評論作爲答案,這樣它可以被提升/接受。這是做到這一點的正確方法:-) – 2012-02-14 22:48:18

回答

14

編輯:我已經有這個開放的,離開了,所以我沒注意到@裏卡多的回答。因爲matplotlib會將事物轉換爲numpy數組,所以有更有效的方法來完成它。

作爲一個例子:

只是繪製兩個不同的線,一條用虛線線型和另一個與固體線型。

E.g.

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

對於他們是循環的情況下,使用屏蔽數組:

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

Was思考這樣的事情,但不知何故決定以複雜的方式做到這一點:D。非常好:) – 2012-02-14 23:38:07

+0

很高興我只是刷新了這一點。正在考慮使用蒙版數組。很有幫助。感謝所有的見解。 – Sceeerutinizer 2012-02-14 23:46:16

+0

http://stackoverflow.com/questions/27082282/changing-line-style-for-certain-range-of-values-using-matplotlib – Ohm 2014-11-22 20:39:41

3

比方說,你的數據是與NumPy陣列dataset1dataset2以及您所定義threshold爲您的意義

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

我想我可以使用'itertools'中的某些東西來縮短它,但我想這足夠好了:P – 2012-02-14 23:03:40