Python 基于值的彩色matplotlib条形图

Python 基于值的彩色matplotlib条形图,python,matplotlib,Python,Matplotlib,有没有一种方法可以根据条形图的值为条形图的条形图着色。例如: - values below -0.5: red - values between -0.5 to 0: green - values between 0 to 08: blue - etc 我发现了一些基本的条形着色示例,但没有任何可以满足值范围的示例,例如上面的示例 更新: 谢谢kikocorreoso的建议。根据您的示例,当两个轴都是数字时,这非常有效。然而,在我的例子中,我的原始数据结构是一个数据帧。然后我使用df.stac

有没有一种方法可以根据条形图的值为条形图的条形图着色。例如:

- 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()
将numpy导入为np
将matplotlib.pyplot作为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],颜色='red')
plt.bar(x[mask2],y[mask2],颜色='蓝色')
plt.show()
结果应该是:

更新:

当你更新你的问题时,我会更新代码。对于您的简单案例,如果我理解正确,您可以执行以下(丑陋的)黑客操作:

将熊猫作为pd导入
df=pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6]},
索引=['row1'、'row2'、'row3'])
dfstacked=df.stack()

mask=dfstacked我知道这个问题很久以前就有人问过了,但为了防止它对某人有帮助,这对我来说很有用:

迭代所有值并根据自定义条件将颜色附加到列表中,这样您就可以得到一个包含尽可能多的颜色规格的列表;然后使用
plt.bar()
中的颜色列表:

将numpy导入为np
将matplotlib.pyplot作为plt导入
x=np.arange(10)
y=np.arange(10)*0.1
col=[]
对于y中的val:
如果val<0.4:
col.append('蓝色')
elif val>=0.7:
col.append('绿色')
其他:
col.append('red')
#颜色如下:[“蓝色”、“蓝色”、“蓝色”、“蓝色”、“红色”、“红色”、“绿色”、“绿色”、“绿色”]
打印条(x,y,颜色=柱)
将numpy作为np导入
将matplotlib.pyplot作为plt导入
x=np.arange(4)
y=np.数组([-2,3,-1,2])
cc=['colors']*len(y)
对于n,枚举中的val(y):
如果val=0
cc[n]=“蓝色”
plt.bar(x,y,颜色=cc)
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()
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()