首页 > 解决方案 > 根据数据更改图表列颜色

问题描述

我有一个解析 csv 文件并从中创建混合图表的 python 脚本。

如果当前进度自上一个进度以来下降了 5 以上,我想将 CurrentProg 栏的颜色更改为红色。是否有可能做到这一点?

例如,下表是我正在解析的 csv 文件的示例。我希望 Derick 和 Lisa 的 CurrentProg 条为红色,如下图所示。

名称 OldProg PrevProg CurrentProg Goal
Derick 45 60 52 90
Jenna 56 87 89 90
Lisa 78 93 76 90
Harry 98 84 79 90

在此处输入图像描述

这是解析 csv 文件并将它们放入图表的条/线的代码片段。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv("file.csv")
names = df['name'].values
x = np.arange(len(names))*2
w = 0.40
plt.bar(x-w, df['Old Progress'].values, width=w*0.7, label='OldProg', color = "cyan")
plt.bar(x, df['Previous Progress'].values, width=w*0.7, label='PrevProg', color = "green")
plt.bar(x+w, df['Current Progress'].values, width=w*0.7, label='CurrentProg', color = "blue")
plt.plot(x, df['Goal'].values, lw=2, label='Goal', color = "red")

如果我需要进一步澄清任何事情,请告诉我。谢谢你。

标签: pythonmatplotlib

解决方案


plt.bar()可以接受与条形图中的项目数长度相同的颜色列表,而不仅仅是一种颜色。

因此,您可以计算条形图中每个元素的颜色,并将其作为colors参数传递。

像这样的东西应该可以解决问题:

df = pd.read_csv('test.csv')
progress_difference = df['CurrentProg'] - df['PrevProg']
colors = ['Red' if d < -5 else 'Grey' for d in progress_difference]
...
plt.bar(x+w, df['CurrentProg'].values, width=w*0.7, 
        label='CurrentProg', color = colors)

推荐阅读