2015-11-02 304 views
2

是否有一種方法根據條的值對條形圖的條進行着色。例如:基於值的顏色matplotlib條形圖

- values below -0.5: red 
- values between -0.5 to 0: green 
- values between 0 to 08: blue 
- etc 

我已經找到了一些基本的酒吧着色的例子,但沒有什麼可以迎合價值範圍的,比如上面的例子。

更新:

謝謝你的建議kikocorreoso。當兩個座標軸都是數字時,這很有用。但在我的情況下,我的原始數據結構是一個熊貓數據框。然後我使用df.stack()並繪製結果。這意味着數據幀行/列成爲圖的x軸,數據框單元是Y軸(條)。

我已經嘗試根據您的示例進行遮罩,但當Y軸是數字且X軸是名稱時,它似乎不起作用。例如:

 col1 col2 col3 col4 
row1 1  2  3  4 
row2 5  6  7  8 
row3 9  10  11  12 
row4 13  14  15  16 

上述數據幀需要被繪製成與形成x軸的行/列組合一個條形圖。每個單元格的值將是一個條。最終,根據原始問題對條進行着色。謝謝

回答

10

你可以爲你的數據集使用蒙版。一個基本的例子可能是以下幾點:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.arange(10) 
y = np.arange(10) * 0.1 

mask1 = y < 0.5 
mask2 = y >= 0.5 

plt.bar(x[mask1], y[mask1], color = 'red') 
plt.bar(x[mask2], y[mask2], color = 'blue') 
plt.show() 

結果應該是: enter image description here

UPDATE:

當你更新你的問題我更新的代碼。爲了您簡單的例子,如果我理解正確的話,你可以做以下(醜)黑客:

import pandas as pd 

df = pd.DataFrame({'col1':[1,2,3], 'col2':[4,5,6]}, 
        index = ['row1','row2','row3']) 

dfstacked = df.stack() 

mask = dfstacked <= 3 

colors = np.array(['b']*len(dfstacked)) 
colors[mask.values] = 'r' 

dfstacked.plot(kind = 'bar', rot = 45, color = colors) 
plt.show() 

或使用更爲OO solution

代碼簡要說明:

  • 我創建了一個面具我紅柱
  • 我創建的顏色數組
  • 變化,以便使用其他顏色我蒙面的顏色數組值
  • 由於dfstacked數據框有MultiIndex,因此我使用rot關鍵字來旋轉它們。如果你想自動化它以獲得一個漂亮的陰謀,你可以在plt.show()之前使用plt.tight_layout()

我希望它有幫助。

+0

對不起,延遲迴復。這看起來不錯,但我似乎無法讓它工作,當一個軸是一個名稱列表,而不是數字。我已經更詳細地編輯了最初的問題。如果您有解決方案,您可以發佈更新嗎? – darkpool