基于值的颜色matplotlib条形图

dar*_*ool 7 python matplotlib

有没有办法根据条形值为条形图的条形着色.例如:

- values below -0.5: red
- values between -0.5 to 0: green
- values between 0 to 08: blue
- etc
Run Code Online (Sandbox Code Playgroud)

我找到了一些条形着色的基本例子,但没有任何可以满足价值范围的例子,例如上面的例子.

更新:

谢谢你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
Run Code Online (Sandbox Code Playgroud)

需要将上述数据帧绘制为条形图,其中行/列组合形成x轴.每个单元格值都是一个条形.最后,根据原始问题对条形图进行着色.谢谢

kik*_*oso 17

您可以为数据集使用掩码.一个基本的例子如下:

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()
Run Code Online (Sandbox Code Playgroud)

结果应该是: 在此输入图像描述

更新:

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

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()
Run Code Online (Sandbox Code Playgroud)

或者使用更多的OO解决方案.

该代码简要解释:

  • 我为我的红色柱子创建了一个面具
  • 我创建了一系列颜色
  • 更改颜色数组,以便为​​我的蒙版值使用其他颜色
  • 由于dfstacked数据框MultiIndex的刻度不是很好,所以我使用rot关键字来旋转它们.如果你想自动化它以获得一个你plt.tight_layout()以前可以使用的好的情节plt.show().

我希望它有所帮助.


小智 10

我看到很久以前就有人问过这个问题,但以防万一它可以帮助某人,这对我有用:

迭代所有值并根据自定义条件将颜色附加到列表中,因此您将获得一个列表,该列表具有与您拥有的值一样多的颜色规范;然后使用颜色列表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)

Run Code Online (Sandbox Code Playgroud)


Jes*_*tad 7

使用列表理解和条件表达式:

profit_color = [('green' if p > 0 else 'red') for p in profit]

plt.bar(year, profit, color=profit_color)
Run Code Online (Sandbox Code Playgroud)

具有值范围的完整示例:

import matplotlib.pyplot as plt

profit = [-4.56, -0.81, -0.47, 0.25, 1.05, 1.93, 2.91, 3.43]
year = [*range(len(profit))]

profit_color = [{p<0: 'red', 0<=p<=2: 'orange', p>2: 'green'}[True] for p in profit]

plt.bar(year, profit, color=profit_color)
plt.show()
Run Code Online (Sandbox Code Playgroud)

输出: 基于条形值的颜色