我有一個帶有百分比標簽的堆積餅圖。外部餅圖有我想要的標簽;但是,內部圖表的標簽應基于它在外部餅圖下的位置。例如,在下圖中,對于外部餅圖的每種顏色,內部餅圖的百分比標簽的總和應為 100%。目前,對于紅色的外部餅圖,內部餅圖有11.0%、12.0%、7.0%,這是沒有考慮外部圖表的自身百分比。我希望他們為外部餅圖的綠色和黃色顏色顯示 35%、38%、27% 和相同的值,其中內部圖表標簽取決于外部餅圖顏色。

這是一個可重現的示例
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
options = ['RED','YELLOW','GREEN']
color_list1 = []
color_list2 = []
for i in np.arange(100):
color1 = random.choice(options)
color2 = random.choice(options)
color_list1.append(color1)
color_list2.append(color2)
test_df = pd.DataFrame(list(zip(color_list1, color_list2)), columns =['Outer_Color', 'Inner_Color'])
outer = pd.DataFrame(test_df.groupby('Outer_Color').size())
inner = pd.DataFrame(test_df.groupby(['Outer_Color', 'Inner_Color']).size())
inner_labels = inner.index.get_level_values(1)
my_pal = {"RED": "r", "YELLOW": "yellow", "GREEN":"g"}
fig, ax = plt.subplots(figsize=(14,7))
size = 0.3
ax.pie(outer.values.flatten(), radius=1,
# labels=outer.index,
autopct='%1.1f%%', pctdistance=0.85, # labeldistance=0.2,
wedgeprops=dict(width=size, edgecolor='w'),
colors=[my_pal[key] for key in outer.index])
ax.pie(inner.values.flatten(), radius=1-size,
# labels = inner_labels,
autopct='%1.1f%%', pctdistance=0.7, # labeldistance=1.2,
wedgeprops=dict(width=size, edgecolor='w'),
colors=[my_pal[key] for key in inner_labels])
plt.show()
uj5u.com熱心網友回復:
您可以采取的一種方法是計算內部楔形相對于外部楔形的百分比,然后制作新標簽以在您這樣做時通過ax.pie。例如:
# Construct inner labels
inner_str_label = [] # new labels storage
n_inside = 3 # number of inner wedges per outer wedge
for idx, outer_value in enumerate(outer.values.flatten()):
# Get inner values for each outer wedge
for inner_value in inner.values.flatten()[idx*n_inside:idx*n_inside n_inside]:
# format for only 1 decimal place
new_label = f"{'{0:.1f}'.format(inner_value/outer_value*100)}%"
inner_str_label.append(new_label)
ax.pie現在我們可以在using中傳遞新標簽labels:
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
if __name__ == '__main__':
options = ['RED', 'YELLOW', 'GREEN']
color_list1 = []
color_list2 = []
for i in np.arange(100):
color1 = random.choice(options)
color2 = random.choice(options)
color_list1.append(color1)
color_list2.append(color2)
test_df = pd.DataFrame(list(zip(color_list1, color_list2)), columns =['Outer_Color', 'Inner_Color'])
outer = pd.DataFrame(test_df.groupby('Outer_Color').size())
inner = pd.DataFrame(test_df.groupby(['Outer_Color', 'Inner_Color']).size())
my_pal = {"RED": "r", "YELLOW": "yellow", "GREEN": "g"}
fig, ax = plt.subplots(figsize=(14, 7))
size = 0.3
ax.pie(outer.values.flatten(), radius=1,
# labels=outer.index,
autopct='%1.1f%%', pctdistance=0.85, # labeldistance=0.2,
wedgeprops=dict(width=size, edgecolor='w'),
colors=[my_pal[key] for key in outer.index])
# Construct inner labels
inner_str_label = [] # new labels storage
n_inside = 3 # number of inner wedges per outer wedge
for idx, outer_value in enumerate(outer.values.flatten()):
# Get inner values for each outer wedge
for inner_value in inner.values.flatten()[idx*n_inside:idx*n_inside n_inside]:
# format for only 1 decimal place
new_label = f"{'{0:.1f}'.format(inner_value/outer_value*100)}%"
inner_str_label.append(new_label)
wedges, labels = ax.pie(inner.values.flatten(), radius=1-size, labels=inner_str_label, labeldistance=0.8,
wedgeprops=dict(width=size, edgecolor='w'),
colors=[my_pal[key] for key in inner.index.get_level_values(1)])
# Fix inner label position
for string_label in labels:
string_label.update({"rotation": 0, "horizontalalignment": "center", "verticalalignment": "center"})
plt.show()

請注意,這是假設每個外楔具有相同數量的內楔。如果內部楔形的數量不規則,則方法類似,但您在串列中設定每個外部楔形的內部楔形數量:
# Construct inner labels
inner_str_label = [] # new labels storage
n_inside_list = [2, 3, 2] # number of inner wedges per outer wedge
for idx, outer_value in enumerate(outer.values.flatten()):
# Get inner values for each outer wedge
n_inside = n_inside_list[idx]
for inner_value in inner.values.flatten()[idx*n_inside:idx*n_inside n_inside]:
# format for only 1 decimal place
new_label = f"{'{0:.1f}'.format(inner_value/outer_value*100)}%"
inner_str_label.append(new_label)
希望這會有所幫助 - 干杯!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/532766.html
