2015-11-02 185 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