2015-02-24 42 views
0

有沒有辦法讓matplotlib用同一行連接兩個不同數據集的數據?用同一行連接不同的數據系列

上下文:我需要繪製一些日誌規模的數據,但其中一些是負面的。我用繪製不同的顏色(正面和綠色爲負紅色),類似的數據絕對值的解決方法:

import pylab as pl 
pl.plot(x, positive_ys, 'r-')  # positive y's 
pl.plot(x, abs(negative_ys), 'g-') # negative y's 
pl.show() 

然而,因爲它們代表相同的數量,這將是有幫助的兩個數據序列由相同的線路連接。這可能嗎?我不能使用pl.plot(x, abs(ys)),因爲我需要能夠區分正值和負值。

回答

1

使用numpy可以使用邏輯索引。

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(111) 

x = np.array([10000, 1000, 100, 10, 1, 5, 50, 500, 5000, 50000]) 
y = np.array([-10000, -1000, -100, -10, -1, 5, 50, 500, 5000, 50000]) 

ax.plot(x,abs(y),'+-b',label='all data') 
ax.plot(abs(x[y<= 0]),abs(y[y<= 0]),'o',markerfacecolor='none', 
             markeredgecolor='r', 
             label='we are negative') 

ax.set_xscale('log') 
ax.set_yscale('log') 

ax.legend(loc=0) 

plt.show() 

的主要特點是首先繪製所有絕對y - 值,然後重新繪製那些原本否定的,因爲空心圓他們挑出。這第二步使用邏輯索引x[y<=0]y[y<=0]來挑選那些爲負數的y數組中的那些元素。

上面的例子給你這個數字:

marked negative


如果你真的有兩個不同的數據集,下面的代碼會給你同樣的圖如上:

x1 = np.array([1, 10, 100, 1000, 10000]) 
x2 = np.array([5, 50, 500, 5000, 50000]) 

y1 = np.array([-1, -10, -100, -1000, -10000]) 
y2 = np.array([5, 50, 500, 5000, 50000]) 

x = np.concatenate((x1,x2)) 
y = np.concatenate((y1,y2)) 

sorted = np.argsort(y) 

ax.plot(x[sorted],abs(y[sorted]),'+-b',label='all data') 
ax.plot(abs(x[y<= 0]),abs(y[y<= 0]),'o',markerfacecolor='none', 
             markeredgecolor='r', 
             label='we are negative') 

在這裏,您首先使用np.concatenate來組合x - 和y-陣列。然後,您採用np.argsort來排序y -array,以確保在繪圖時不會出現過多的曲折線。當您調用第一個繪圖時,可以使用該索引數組(sorted)。由於第二個繪圖僅繪製符號但沒有連接線,因此您不需要在此排序數組。

+0

非常感謝!這就是我一直在尋找的! – user2669155 2015-03-01 03:18:16

相關問題