我嘗試生成一個嵌套餅圖作為下面的示例。但是,文本位置看起來并不像應有的那樣漂亮。我想調整內部餅圖中的文本位置,使其適合餅圖部分(最好沿著紅線,但如果它在里面并且看起來不錯就可以了)。另外,我想洗掉餅圖的一部分,如下圖所示。任何幫助都會非常有幫助。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data=pd.read_csv(r"https://raw.githubusercontent.com/tuyenhavan/Course_Data/main/test_pie_chart.csv")
# Get outer and inner counts
inner=data.groupby(["Col1"]).size()
outer=data.groupby(["Col1","Col2"]).size()
# Get outer and inner labels
inner_label=[f"{idx} ({val/sum(inner.values.flatten())*100:.2f}%)" for idx, val in zip(inner.index.get_level_values(0),inner.values.flatten())]
outer_label=[f"{idx} ({val/sum(outer.values.flatten())*100:.2f}%)" for idx, val in zip(outer.index.get_level_values(1), outer.values.flatten())]
# Inner and outer colors
inner_color=["#16A085","#808000","#BA4A00"]
outer_color=["#808080","#229954","#34495E","#2E86C1","#CA6F1E","white","#808080","#229954","#CA6F1E","#00FFFF"]
# Set figure size and radius adjustment
fig, ax=plt.subplots(figsize=(10,8))
size=0.4
# Plot the inner pie chart
ax.pie(inner.values.flatten(), labels=inner_label, radius=1-size,wedgeprops=dict(width=size, edgecolor='w'),\
colors=inner_color,textprops ={"fontsize":12},labeldistance=0.4) # labels=inner_label,autopct ='%1.1f%%',
# Plot the outer pie chart
ax.pie(outer.values.flatten(), radius=1, labels=outer_label,wedgeprops=dict(width=size, edgecolor='w'),\
colors=outer_color, textprops={"fontsize":12},labeldistance=1.1)
ax.set(xlim=(-1,1), ylim=(-1,1))
ax.set(aspect="equal")
plt.show()

uj5u.com熱心網友回復:
要實作您想要的,您必須使用文本標簽。您可以定位每個單獨的楔形和標簽。從ax.pie()方法回傳楔形和標簽串列。
要洗掉標簽,只需將其文本設定為空字串。
為了有更好的內部標簽,我建議將百分比移動到新行,然后相應地旋轉每個標簽。
這是這樣做的代碼片段:
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv(r"https://raw.githubusercontent.com/tuyenhavan/Course_Data/main/test_pie_chart.csv")
# Get outer and inner counts
inner = data.groupby(["Col1"]).size()
outer = data.groupby(["Col1", "Col2"]).size()
# Get outer and inner labels
inner_label = [f"{idx} \n({val / sum(inner.values.flatten()) * 100:.2f}%)" for idx, val in
zip(inner.index.get_level_values(0), inner.values.flatten())]
outer_label = [f"{idx} ({val / sum(outer.values.flatten()) * 100:.2f}%)" for idx, val in
zip(outer.index.get_level_values(1), outer.values.flatten())]
# Inner and outer colors
inner_color = ["#16A085", "#808000", "#BA4A00"]
outer_color = ["#808080", "#229954", "#34495E", "#2E86C1", "#CA6F1E", "white", "#808080", "#229954", "#CA6F1E",
"#00FFFF"]
# Set figure size and radius adjustment
fig, ax = plt.subplots(figsize=(10, 8))
size = 0.4
# Plot the inner pie chart
wedges_lst, labels_lst = ax.pie(inner.values.flatten(), labels=inner_label, radius=1 - size, wedgeprops=dict(width=size, edgecolor='w'), \
colors=inner_color, textprops={"fontsize": 12}, labeldistance=0.6) # labels=inner_label,autopct ='%1.1f%%',
labels_lst[0].update({"rotation": 0, "horizontalalignment": "center", "verticalalignment": "center"})
labels_lst[1].update({"rotation": 135, "horizontalalignment": "center", "verticalalignment": "center"})
labels_lst[2].update({"rotation": 225, "horizontalalignment": "center", "verticalalignment": "center"})
# Plot the outer pie chart
wedges_lst, labels_lst = ax.pie(outer.values.flatten(), radius=1, labels=outer_label, wedgeprops=dict(width=size, edgecolor='w'), \
colors=outer_color, textprops={"fontsize": 12}, labeldistance=1.1)
# Remove # No text label
labels_lst[5].update({"text": ""})
ax.set(xlim=(-1, 1), ylim=(-1, 1))
ax.set(aspect="equal")
plt.show()
導致:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/440751.html
標籤:Python matplotlib 文本 饼形图 图例属性
