Python中如何为Pandas DataFrame条形图的单个条形自定义颜色?
Pandas横向条形图修改单个条形颜色的解决方案
初始代码
用户原本用于绘制横向条形图的代码:
import pandas as pd import matplotlib.pyplot as plt import numpy as np df = pd.DataFrame({"first":np.arange(1,6), "second":np.arange(2,7)}) df.plot(kind="barh", color=tuple(["g", "b"]))
需求与问题
希望将df.loc[0,"first"]对应的最短绿色条形修改为自定义颜色#af12be22,最初期望通过给plot方法的color参数传入颜色DataFrame来控制每个单元格的条形颜色,示例代码如下:
df = pd.DataFrame({"first":np.arange(1,6), "second":np.arange(2,7)}) df_colors = pd.DataFrame({"first":["#af12be22"] + 4*["g"], "second":5*["b"]}) df.plot(kind="barh", color=df_colors)
但查阅Pandas官方文档后发现,color参数仅支持设置列间的颜色差异,无法控制列内单个条形的颜色。尝试将df_colors转为NumPy数组或列表时,触发如下错误:
ValueError: Invalid color ['#af12be22' 'g' 'g' 'g' 'g']
简便解决方法
Pandas的plot方法基于Matplotlib实现,因此可以直接获取绘图返回的Axes对象,手动修改对应条形的颜色:
单个条形修改
如果只需要修改特定单个条形,直接定位对应的patch对象即可:
import pandas as pd import matplotlib.pyplot as plt import numpy as np df = pd.DataFrame({"first":np.arange(1,6), "second":np.arange(2,7)}) # 绘图并获取Axes实例 ax = df.plot(kind="barh", color=tuple(["g", "b"])) # 横向条形图中,patches的顺序为:first列第0行 → first列第1行 → ... → first列第4行 → second列第0行 → ... → second列第4行 # 定位first列第0行的条形并修改颜色 ax.patches[0].set_facecolor("#af12be22") plt.show()
批量按DataFrame控制颜色
如果需要按照预设的颜色DataFrame批量修改所有条形颜色,可以通过遍历patches并匹配行列索引实现:
import pandas as pd import matplotlib.pyplot as plt import numpy as np df = pd.DataFrame({"first":np.arange(1,6), "second":np.arange(2,7)}) df_colors = pd.DataFrame({"first":["#af12be22"] + 4*["g"], "second":5*["b"]}) ax = df.plot(kind="barh", color=tuple(["g", "b"])) patch_index = 0 # 按列、按行遍历DataFrame,对应修改每个条形颜色 for column in df.columns: for row_idx in df.index: ax.patches[patch_index].set_facecolor(df_colors.loc[row_idx, column]) patch_index += 1 plt.show()
内容的提问来源于stack exchange,提问作者Victor Daniel
相关产品推荐
相关产品推荐

