首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >matplotlib中的图例仅显示列表的第一个条目

matplotlib中的图例仅显示列表的第一个条目
EN

Stack Overflow用户
提问于 2021-11-18 20:44:18
回答 2查看 57关注 0票数 0

我正在尝试显示条形图的自定义图例,但它只显示图例列表中的第一个图例。如何显示图例中的所有值?

代码语言:javascript
复制
df.time_to_travel_grouping.value_counts().plot(kind="bar", 
                                               color = ["b","tab:green","tab:red","c","m","y","tab:blue","tab:orange"],
                                               xlabel="TTT", ylabel="Total Counts", 
                                               title="Fig4: Total Counts by Time to Travel Category (TTT)", figsize=(20,15))
plt.legend(["a","b","c","d","e","f","g","h"])
plt.subplots_adjust(bottom=0.15)
plt.subplots_adjust(left=0.15)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-18 21:02:03

让我们使用ax.get_legend_handles_labels从轴获取补丁句柄

代码语言:javascript
复制
s = pd.Series(np.arange(100,50,-5), index=[*'abcdefghij'])
ax = s.plot(kind="bar", 
           color = ["b","tab:green","tab:red","c","m","y","tab:blue","tab:orange"],
           xlabel="TTT", ylabel="Total Counts", 
           title="Fig4: Total Counts by Time to Travel Category (TTT)", figsize=(20,15))


patches, _ = ax.get_legend_handles_labels()
labels = [*'abcdefghij']
ax.legend(*patches, labels, loc='best')

plt.subplots_adjust(bottom=0.15)
plt.subplots_adjust(left=0.15)

输出:

票数 1
EN

Stack Overflow用户

发布于 2021-11-18 21:30:39

要创建自动图例,matplotlib会存储图形元素的标签。在这个柱状图的情况下,完整的“容器”熊猫为完整的“容器”分配了一个标签。

您可以移除容器的标签(指定以_开头的标签),然后将各个标签指定给条形。可以使用xtick标签,因为它们已经是所需的顺序。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

df = pd.DataFrame({'time_to_travel_grouping': np.random.choice([*'abcdefgh'], 200)})
ax = df.time_to_travel_grouping.value_counts().plot(kind="bar",
                                                    color=["b", "tab:green", "tab:red", "c", "m", "y", "tab:blue", "tab:orange"],
                                                    xlabel="TTT", ylabel="Total Counts",
                                                    title="Fig4: Total Counts by Time to Travel Category (TTT)",
                                                    figsize=(20, 15))

ax.containers[0].set_label('_nolegend')
for bar, tick_label in zip(ax.containers[0], ax.get_xticklabels()):
    bar.set_label(tick_label.get_text())
ax.legend()
plt.tight_layout()
plt.show()

通过更少的内部操作,可以通过seaborn获得类似的结果:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns

df = pd.DataFrame({'time_to_travel_grouping': np.random.choice([*'abcdefgh'], 200)})

plt.figure(figsize=(20, 15))
ax = sns.countplot(data=df, x='time_to_travel_grouping', hue='time_to_travel_grouping',
                   palette=["b", "tab:green", "tab:red", "c", "m", "y", "tab:blue", "tab:orange"],
                   order=df.time_to_travel_grouping.value_counts().index,
                   dodge=False)
plt.setp(ax, xlabel="TTT", ylabel="Total Counts", title="Fig4: Total Counts by Time to Travel Category (TTT)")
plt.tight_layout()
plt.show()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70026518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档