有没有办法根据条形图的值为条形图的条形着色。例如:
- values below -0.5: red
- values between -0.5 to 0: green
- values between 0 to 08: blue
- etc
我找到了一些条形着色的基本例子,但没有任何可以满足价值范围的例子,例如上面的例子。
更新:
谢谢kikocorreoso的建议。根据您的示例,当两个轴都是数字时,这很有效。但是在我的情况下,我的原始数据结构是一个pandas数据帧。然后我使用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轴。每个单元格值都是一个条形。最后,根据原始问题对条形图进行着色。感谢
答案 0 :(得分:15)
您可以为数据集使用蒙版。一个基本的例子如下:
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()
更新:
当您更新问题时,我会更新代码。对于你的简单案例,如果我理解正确,你可以做以下(丑陋)黑客攻击:
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.tight_layout()
之前使用plt.show()
。我希望它有所帮助。
答案 1 :(得分:5)
我看到这个问题已经很久以前问过了,但是以防万一它可以帮助某人,这对我有用:
遍历所有值,并根据自定义条件将颜色附加到列表中,这样您就可以获得具有与值一样多的颜色规格的列表;然后使用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)
答案 2 :(得分:0)