python 中带有百分比标签的圆形条形图
Circular barplot in python with percentage labels
我是 python 的新手,对 R 几乎没有经验。
我有一个包含 gut_list 和百分比的数据框。我想创建一个带标签的圆形 barplot/race 轨迹图。我在 R ggplot 中看到一个 post 来创建类似于 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)
这里有一些示例代码来创建这样一个 "concentric circle chart" 又名 "concentric rings chart"。
主要思想是用pie
的x
数组来表示要用多少圆。并且一次只能放一个x
。 docs 表示如果 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()
我是 python 的新手,对 R 几乎没有经验。
我有一个包含 gut_list 和百分比的数据框。我想创建一个带标签的圆形 barplot/race 轨迹图。我在 R ggplot 中看到一个 post 来创建类似于 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)
这里有一些示例代码来创建这样一个 "concentric circle chart" 又名 "concentric rings chart"。
主要思想是用pie
的x
数组来表示要用多少圆。并且一次只能放一个x
。 docs 表示如果 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()