【问题标题】:How to make a more visually appealing bar plot with my data如何使用我的数据制作更具视觉吸引力的条形图
【发布时间】:2018-08-23 17:22:38
【问题描述】:

我正在尝试在 matplotlib 中使用 barh 绘制此数据框。

SAMPLE DF:

    genre              tracks_sold   percentage
0   Rock                  561        53.377735
1   Alternative & Punk    130        12.369172
2   Metal                 124        11.798287
3   R&B/Soul               53         5.042816
4   Blues                  36         3.425309

genre_sold_usa.plot.barh()

我试图让这个情节在视觉上更具信息性。

我希望我的情节以这种类似的方式进行,但更具视觉吸引力:

请指导我还有什么可以使它具有视觉吸引力的方法。

【问题讨论】:

标签: python python-3.x matplotlib


【解决方案1】:

鉴于 df 作为 DataFrame,我只是试图重现您提供的示例。在我看来,旋转y-labels 更有意义。 “视觉吸引力”是一个主观问题。

fig = plt.figure(figsize=(10, 6))
ax = df.plot.barh(y='tracks_sold', x='genre', color='mediumseagreen', ec='k', lw=1)
plt.xlim(0, 630)
plt.yticks(rotation=30)
plt.ylabel('')
plt.title('Top Selling Genres in the USA')
ax.legend_.remove()

# Way 1 of putting percentage values
for i in range(len(df)):
    ax.text(tracks_sold[i] + 5, 0.98*i, str(int(percentage[i])) + '%', color='black', fontweight='bold')

# Way 2 of putting percentage values
# for i, p in enumerate(ax.patches):
#    ax.annotate(str(int(percentage[i])) + '%', (p.get_width() * 1.02, i)) 

输出

【讨论】:

  • 您能详细解释一下您是如何将百分比放在条形顶部的吗?你能多解释一下代码的 for 循环部分吗?
  • 使用for 循环完成。您提取补丁(条)并通过ax.patches 循环它们。由于图中有 5 个补丁,i 将从 0 变为 4。p.get_width() 为您提供每个条的高度(水平)。你把它乘以 1.02 只是为了稍微向右移动它。 str(int(percentage[i])) 只是将百分比值转换为最接近的整数,然后将其转换为字符串。 ax.annotate 然后将这个字符串百分比值放在 (x,y) 值,其中 x = p.get_width() * 1.02y=0, 1, 2, 3, 4 这是 y 轴上每个条的中心
  • enumerate 是一种获取您正在迭代的列表/数组的值以及从 0 开始到 len(list)-1 的每个元素的索引的方法。如果对您有帮助,请随时接受答案。
  • 我能知道ec和lw是什么意思吗?我在文档页面中找不到任何内容。 ax = df.plot.barh(y='tracks_sold', x='genre', color='mediumseagreen', ec='k', lw=1)
  • 我在上面的答案代码和修改后的输出图中添加了第二种方法。现在或多或少处于中间位置。您可以通过当前更改因子0.98 来进一步控制仓位。不过差别不大
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 2011-02-18
  • 2018-01-10
  • 2010-11-04
  • 1970-01-01
  • 2012-09-17
  • 2017-01-31
  • 1970-01-01
相关资源
最近更新 更多