【问题标题】:Circular barplot in python with percentage labelspython中带有百分比标签的圆形条形图
【发布时间】:2021-11-27 22:43:24
【问题描述】:

我是python的新手,R方面的经验很少。

我有一个带有 gut_list 和百分比的数据框。我想创建一个带有标签的圆形条形图/赛道图。我在 R ggplot 中看到了一个帖子,以创建与 hallow center 类似的东西。但我不确定如何在 python 中使用 ggplot。

我想要与以下 R 组类似的输出。但我想尝试使用 python 包来创建带有标记值和图例的图。

Making a circular barplot with a hollow center (aka race track plot)

示例数据:

gut_list = ("Micro1", "Micro2", "Micro3", "Micro4", "Micro5", "Micro6")
percent = (2, 77, 22, 41, 21, 9)

初审:

import matplotlib.pyplot as plt
from matplotlib import cm
from math import log10

gut_list = ("Micro1", "Micro2", "Micro3", "Micro4", "Micro5", "Micro6") 
percent = [2, 77, 22, 41, 21, 9]
#number of data points
n = len(percent)
#find max value for full ring
k = 10 ** int(log10(max(percent)))
m = k * (1 + max(percent) // k)

#radius of donut chart
r = 1.5
#calculate width of each ring
w = r / n 

#create colors along a chosen colormap
colors = [cm.PuBu(i / n) for i in range(n)]

#create figure, axis
fig, ax = plt.subplots()
ax.axis("equal")

for i in range(n):
    innerring, _ = ax.pie([m - percent[i], percent[i]], radius = r - i * w, startangle = 90, colors = ["white", colors[i]])
    plt.setp(innerring, width = w, edgecolor = "lightgrey")


plt.legend()
plt.show()

我仍然没有设法添加标签或图例。

预期结果是 (i.stack.imgur.com/hOv9q.png)

【问题讨论】:

  • 欢迎来到 SO。请使用适当的语法分享一些数据。您是否搜索过 matplotlib 或其他绘图库?
  • 谢谢@Raphael。现在将数据更正为 python 语法。是的,我试过甜甜圈图。它给了我一个戒指。但我想要多个环 (i.stack.imgur.com/hOv9q.png)。
  • 这是一个“赛道情节”,但它们通常不是圆形的。如果我是你,我会尝试实现水平跑道,然后在你迷路时寻求帮助。有时(很多)我们设法从更简单的问题开始解决问题。搜索“race track chart plot python”this 可能会有所帮助。
  • 我在这里添加了初始脚本试用。

标签: python matplotlib data-visualization donut-chart python-ggplot


【解决方案1】:

这里是一些示例代码来创建这样一个“同心圆图”又名“同心环图”。

主要思想是使用piex 数组来指示要使用多少圆。一次只放一个xdocs 告诉如果 x 的总数小于 1,它将被视为一个百分比(否则所有内容将被求和并按总和的比例显示,这将使单个 x 100%)。 counterclock=False 将具有所需方向的弧。现在重新计算单个x,以便最大弧将是百分比列表中设置的百分比。

需要注意的是外半径r 和内半径都是必需的。在当前代码中,内半径仅用于计算偏移每个圆的width 步骤。

饼图可以在饼图部分本身上显示标签,但在我们的例子中,自动放置可能会造成混淆。设置labels=['desired label'] 会将标签放入图例中。设置labeldistance=None 将不会显示在图表上。可以放置图例,使其右上角位于图表的顶部中心。当百分比过高并且弧会重叠时,将其放置在其他地方。

或者,文本可以直接显示在圆弧旁边。在data coordinates 中,圆圈的中心位于0,0。因此,y=radius-w/2 位于每个环的起始边缘的中心。文本右对齐并垂直居中。

import matplotlib.pyplot as plt

cathegories = ["Electronics", "Appliances", "Books", "Music", "Clothing", "Cars", "Food/Beverages", "Personal Hygiene",
               "Personal Health/OTC", "Hair Care"]
percent = [81, 77, 70, 69, 69, 68, 62, 62, 61, 60]

# number of data points
n = len(percent)
# percent of circle to draw for the largest circle
percent_circle = max(percent) / 100

r = 1.5  # outer radius of the chart
r_inner = 0.4  # inner radius of the chart
# calculate width of each ring
w = (r - r_inner) / n

# create colors along a chosen colormap
#colors = [plt.cm.plasma(i / n) for i in range(n)]
colors = plt.cm.tab10.colors

# create figure, axis
fig, ax = plt.subplots()
ax.axis("equal")

for i in range(n):
    radius = r - i * w
    ax.pie([percent[i] / max(percent) * percent_circle], radius=radius, startangle=90,
           counterclock=False,
           colors=[colors[i]],
           labels=[f'{cathegories[i]} – {percent[i]}%'], labeldistance=None,
           wedgeprops={'width': w, 'edgecolor': 'white'})
    ax.text(0, radius - w / 2, f'{cathegories[i]} – {percent[i]}% ', ha='right', va='center')

# plt.legend(loc='upper right', bbox_to_anchor=(0.5, 1.1), prop={'size': 12})
plt.tight_layout()
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多