簡體   English   中英

基於值的顏色 matplotlib 條形圖

[英]Color matplotlib bar chart based on value

有沒有辦法根據條形圖的值為條形圖的條形着色。 例如:

- 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 軸。 每個單元格值將是一個條形。 最后,根據原始問題為條形着色。 謝謝

您可以為數據集使用掩碼。 一個基本示例如下:

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()

結果應該是: 在此處輸入圖片說明

更新:

當你更新你的問題時,我更新了代碼。 對於您的簡單案例,如果我理解正確,您可以執行以下(丑陋的)hack:

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()

或者使用更面向對象的解決方案

代碼簡要說明:

  • 我為我的紅柱創建了一個蒙版
  • 我創建了一系列顏色
  • 更改顏色數組以便為我的蒙版值使用其他顏色
  • 由於dfstacked數據幀有一個MultiIndex ,刻度沒有很好地打印,所以我使用rot關鍵字來旋轉它們。 如果你想自動化它以獲得一個漂亮的圖,你可以在plt.tight_layout()之前使用plt.show()

我希望它有幫助。

我看到很久以前就有人問過這個問題,但以防萬一它可以幫助某人,這對我有用:

迭代所有值並根據自定義條件將顏色附加到列表中,因此您將獲得一個列表,該列表具有與您擁有的值一樣多的顏色規范; 然后使用plt.bar()的顏色列表:

import numpy as np
import matplotlib.pyplot as plt

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

col = []
for val in y:
    if val < 0.4:
        col.append('blue')
    elif val >= 0.7:
        col.append('green')
    else:
        col.append('red')

# col looks like this: ['blue', 'blue', 'blue', 'blue', 'red', 'red', 'red', 'green', 'green', 'green']

plt.bar(x, y, color = col)

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(4)
y = np.array([-2,3,-1,2])
cc=['colors']*len(y)
for n,val in enumerate(y):
    if val<0:
        cc[n]='red'
    elif val>=0
        cc[n]='blue'

plt.bar(x, y, color = cc)
plt.show()

在此處輸入圖片說明

對上述答案的小改進


x = np.arange(4)

y = np.array([-2,3,-1,2])

cc=list(map(lambda x: 'red' if x <= 0 else 'blue', y))

plt.bar(x, y, color = cc)
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM