首页 > 解决方案 > 在多个绘图中保持图例颜色相同

问题描述

我正在处理一个我计算多个统计数据的数据集。对于每个统计数据,我想创建一个堆积条形图。但是,图例的颜色会因图而异,因为显然它们是从头开始为每个图重新计算的。这是一个例子:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(
    {
        "X": ["A"] * 3 + ["B"] * 5,
        "Y": ["a", "b", "c", "a", "b", "c", "d", "e"],
        "v": np.random.random(8),
    }
).set_index(["X", "Y"])

ax = df1.unstack().loc[:, "v"].plot(kind="bar", stacked=True, figsize=(5, 2))
ax.legend(loc="lower center", bbox_to_anchor=(0.5, -0.55), ncol=5)

df2 = pd.DataFrame(
    {
        "X": ["A"] * 3 + ["B"] * 4,
        "Y": ["a", "b", "c", "a", "b", "c", "e"],
        "v": np.random.random(7),
    }
).set_index(["X", "Y"])
ax = df2.unstack().loc[:, "v"].plot(kind="bar", stacked=True, figsize=(5, 2))
ax.legend(loc="lower center", bbox_to_anchor=(0.5, -.55), ncol=5)

结果是两个这样的图:

在此处输入图像描述

可以看到,“e”在两个图中具有不同的颜色。有什么建议我可以在多个图中协调颜色吗?

标签: pythonpandasplot

解决方案


使用 dict 将每个 Serie 的名称映射到颜色。然后在绘图时指定该颜色:

import pandas as pd
import seaborn as sns
import numpy as np

df1 = pd.DataFrame(
    {
        "X": ["A"] * 3 + ["B"] * 5,
        "Y": ["a", "b", "c", "a", "b", "c", "d", "e"],
        "v": np.random.random(8),
    }
).set_index(["X", "Y"])
colores = {'a': 'green', 'b': 'red', 'c': 'orange', 'd': 'blue', 'e': 'brown'}
df_plot1 = df1.unstack()["v"]
ax = df_plot1.plot(kind="bar", stacked=True, figsize=(5, 2), color=df_plot1.columns.map(colores))
ax.legend(loc="lower center", bbox_to_anchor=(0.5, -0.55), ncol=5)

df2 = pd.DataFrame(
    {
        "X": ["A"] * 3 + ["B"] * 4,
        "Y": ["a", "b", "c", "a", "b", "c", "e"],
        "v": np.random.random(7),
    }
).set_index(["X", "Y"])

df_plot2 = df2.unstack()["v"]
ax = df_plot2.plot(kind="bar", stacked=True, figsize=(5, 2), color=df_plot2.columns.map(colores))
ax.legend(loc="lower center", bbox_to_anchor=(0.5, -.55), ncol=5)

在此处输入图像描述 在此处输入图像描述


推荐阅读