matplotlib 图例显示问题

Posted

技术标签:

【中文标题】matplotlib 图例显示问题【英文标题】:matplotlib legend display issue 【发布时间】:2018-03-19 05:55:15 【问题描述】:

我从我的数据框中得到两个值。即('通过',失败')。根据这些值尝试构建饼图。我喜欢在图例中显示这两个值,即使这些值不存在于我的数据框中。 数据框值是“通过”、“失败”

colors = ['green','red']

ax_3 = df_spark["Missing_records_check"].value_counts().sort_index(ascending=False).plt(
    kind='pie',
    y="Missing_records_check",
    figsize=(10, 10),
    legend=True,
    autopct='%1.1f%%',
    startangle=90,
    shadow=False,
    colors=['green','red'])

【问题讨论】:

【参考方案1】:

创建一个分类变量会有所帮助。

from pandas.api.types import CategoricalDtype
colors = ['green','red']

labels=['Passed','Failed']

cat_type = CategoricalDtype(categories=labels, ordered=True)
df_spark["Missing_records_check"] = df_spark["Missing_records_check"].astype(cat_type)
ax_3 =df_spark["Missing_records_check"].value_counts().sort_index(ascending=True)\
.plot(kind='pie',y="Missing_records_check", figsize=(10, 10),legend=True,autopct='%1.1f%%',\
     startangle=90,shadow=False,colors=['green','red'])

由于您还想删除不存在类别的标签,我可能会使用自定义图例。我还添加了一行来根据值对颜色进行排序。-

import pandas as pd
import matplotlib.patches as mpatches

color= ['red' if l == 'Failed' else 'green' for l in df_spark['Missing_records_check']]

ax_3 =df_spark["Missing_records_check"].value_counts().sort_index(ascending=False)\
.plot(kind='pie',y="Missing_records_check", figsize=(10, 10),autopct='%1.1f%%',\
     startangle=90,shadow=False,colors=color, legend=True)

red_patch = mpatches.Patch(color='red', label='Failed')
green_patch = mpatches.Patch(color='green', label='Passed')
ax_3.legend(handles=[green_patch, red_patch])

【讨论】:

它的效果很好,但现在会弹出 2 个不同的项目 1. 每个标签的颜色不是固定的。即标签“通过”应始终为绿色,“失败”应始终为红色,目前“失败”为绿色。 2. 如果两个值中的任何一个为 0%,饼图中间仍然显示为黑色。请告诉我如何避免这种情况。提前致谢 @Jack,请注意我使用了 sort_index(ascending=True),这实际上适用于颜色。 非常感谢您的回复。图例工作得非常好,但饼图值与图例不匹配。例如:饼图值为失败,但图例显示为通过。 着色基于饼图值而不是基于轴标签我也编辑了我的原始帖子。很抱歉造成混乱。 @Jack 我添加了一行来根据值对颜色进行排序。这应该适合你

以上是关于matplotlib 图例显示问题的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 图不显示图例

matplotlib 在散点图中不显示图例

如何在 Python matplotlib 子图中显示图例

Matplotlib 轴图例在 barh 中仅显示一个标签

使用 Matplotlib 在带有图例的热图中显示不同大小的圆圈

matplotlib图例中文乱码问题