如何旋转饼图中的百分比标签以匹配类别标签旋转?
How to rotate the percentage label in a pie chart to match the category label rotation?
我正在从事个人预算可视化项目以培养我的 python 能力,但在我希望饼图显示数据的方式方面遇到了障碍。现在,我有一个饼图,其中包含每个类别的支出和每个类别的预算支出,在饼图之外有类别标签。使用 plt.pie 中的“rotatelabels = True”,旋转标签以与从饼图中心穿过楔形中心的射线对齐。这很好用,但我希望显示在楔形内部的百分比标签也被旋转,以便类别标签和百分比都与上述射线平行。我已经能够按照给定的数量旋转所有百分比,如 post 此处所示:
,但我想将其完善到我的目标。关于使用 text.set_rotation 或其他函数或参数来实现此目的的任何提示?
修改为独立于整个项目的代码片段:
import pandas as pd
cat = ['Utilities', 'Home', 'Bike', 'Medical', 'Personal', 'Food', 'Groceries', 'Student Loans', 'Transit', 'Rent']
dict = {8:54.99,14:59.91,3:69.03,10:79.00,9:119.40,1:193.65,0:205.22,4:350.00,7:396.51,2:500.00}
nonzero_spending = pd.DataFrame(list(dict.items()), columns = ['index_col', 'Sum'])
plt.pie(nonzero_spending['Sum'],labels=cat,radius = 2,startangle = 160,autopct=lambda p : '{:.2f}% ({:,.0f})'.format(p,p * sum(nonzero_spending['Sum'])/100), rotatelabels = True, pctdistance=0.8)
plt.title('Spending')
plt.axis('equal')
plt.show()
您可以提取外部标签的旋转并将其应用于百分比文本:
import matplotlib.pyplot as plt
import pandas as pd
cat = ['Utilities', 'Home', 'Bike', 'Medical', 'Personal', 'Food', 'Groceries', 'Student Loans', 'Transit', 'Rent']
dict = {8: 54.99, 14: 59.91, 3: 69.03, 10: 79.00, 9: 119.40, 1: 193.65, 0: 205.22, 4: 350.00, 7: 396.51, 2: 500.00}
nonzero_spending = pd.DataFrame(list(dict.items()), columns=['index_col', 'Sum'])
patches, labels, pct_texts = plt.pie(nonzero_spending['Sum'], labels=cat, radius=2, startangle=160,
autopct=lambda p: f"{p:.2f}% ({p * sum(nonzero_spending['Sum']) / 100:,.0f})",
rotatelabels=True, pctdistance=0.5)
for label, pct_text in zip(labels, pct_texts):
pct_text.set_rotation(label.get_rotation())
plt.title('Spending')
plt.axis('equal')
plt.tight_layout()
plt.show()
plt.pie()
returns 3 个列表(如果没有百分比文本,则为 2 个):
- 列表"Wedge patches"(圆角三角形)
- 文本标签列表,作为 matplotlib
Text
个对象
- (可选)百分比文本列表(也是
Text
个对象)
for label, pct_text in zip(labels, pct_texts):
是 Python 同时到达 loop through the two lists 的方式。
pct_text.set_rotation(label.get_rotation())
获取每个标签 Text
对象的旋转并将此值设置为相应百分比文本对象的旋转。
我正在从事个人预算可视化项目以培养我的 python 能力,但在我希望饼图显示数据的方式方面遇到了障碍。现在,我有一个饼图,其中包含每个类别的支出和每个类别的预算支出,在饼图之外有类别标签。使用 plt.pie 中的“rotatelabels = True”,旋转标签以与从饼图中心穿过楔形中心的射线对齐。这很好用,但我希望显示在楔形内部的百分比标签也被旋转,以便类别标签和百分比都与上述射线平行。我已经能够按照给定的数量旋转所有百分比,如 post 此处所示:
修改为独立于整个项目的代码片段:
import pandas as pd
cat = ['Utilities', 'Home', 'Bike', 'Medical', 'Personal', 'Food', 'Groceries', 'Student Loans', 'Transit', 'Rent']
dict = {8:54.99,14:59.91,3:69.03,10:79.00,9:119.40,1:193.65,0:205.22,4:350.00,7:396.51,2:500.00}
nonzero_spending = pd.DataFrame(list(dict.items()), columns = ['index_col', 'Sum'])
plt.pie(nonzero_spending['Sum'],labels=cat,radius = 2,startangle = 160,autopct=lambda p : '{:.2f}% ({:,.0f})'.format(p,p * sum(nonzero_spending['Sum'])/100), rotatelabels = True, pctdistance=0.8)
plt.title('Spending')
plt.axis('equal')
plt.show()
您可以提取外部标签的旋转并将其应用于百分比文本:
import matplotlib.pyplot as plt
import pandas as pd
cat = ['Utilities', 'Home', 'Bike', 'Medical', 'Personal', 'Food', 'Groceries', 'Student Loans', 'Transit', 'Rent']
dict = {8: 54.99, 14: 59.91, 3: 69.03, 10: 79.00, 9: 119.40, 1: 193.65, 0: 205.22, 4: 350.00, 7: 396.51, 2: 500.00}
nonzero_spending = pd.DataFrame(list(dict.items()), columns=['index_col', 'Sum'])
patches, labels, pct_texts = plt.pie(nonzero_spending['Sum'], labels=cat, radius=2, startangle=160,
autopct=lambda p: f"{p:.2f}% ({p * sum(nonzero_spending['Sum']) / 100:,.0f})",
rotatelabels=True, pctdistance=0.5)
for label, pct_text in zip(labels, pct_texts):
pct_text.set_rotation(label.get_rotation())
plt.title('Spending')
plt.axis('equal')
plt.tight_layout()
plt.show()
plt.pie()
returns 3 个列表(如果没有百分比文本,则为 2 个):
- 列表"Wedge patches"(圆角三角形)
- 文本标签列表,作为 matplotlib
Text
个对象 - (可选)百分比文本列表(也是
Text
个对象)
for label, pct_text in zip(labels, pct_texts):
是 Python 同时到达 loop through the two lists 的方式。
pct_text.set_rotation(label.get_rotation())
获取每个标签 Text
对象的旋转并将此值设置为相应百分比文本对象的旋转。