Если вы уже видели мой предыдущий вопрос, я пишу программу на Python для оценки данных, которые я собираю, играя в игру Clue. Я решил внедрить графический интерфейс (tkinter) в свою программу, чтобы сделать его более быстрым и простым в работе. В одном из основных окон графического интерфейса показаны различные карты, которые, как я знаю, есть у каждого игрока в руке, карты, которые, как я знаю, должны быть посередине, «карты убийства», и неизвестные карты, которые окончательно не помещены в вышеуказанные категории. , Я решил реализовать эти данные с помощью круговой диаграммы matplotlib, по пять клиньев для каждой из ранее упомянутых категорий.
В данный момент меня не интересует, как я реализую эту функцию matplotlib в моем виджете tkinter. Я сосредоточен исключительно на дизайне графика.
Пока что я задокументировал карты, которые находятся в руке каждого игрока в словаре, где ключи - это имена игроков, а значения - это набор карт, которые находятся в их руках. Например ...
player_cards = { 'player1':{'Mustard', 'Scarlet', 'Revolver', 'Knife', 'Ballroom', 'Library'}, 'player2':{}, 'player3':{} }
Таким образом, данные для первых трех клиньев круговой диаграммы будут извлечены из словаря. Для двух других клиньев данные будут храниться в аналогично организованных наборах.
Посмотрев на сайт matplotlib.org, я увидел пример, в котором Сорта демонстрирует то, что я ищу ...

с кодом ...
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))
recipe = ["225 g flour",
"90 g sugar",
"1 egg",
"60 g butter",
"100 ml milk",
"1/2 package of yeast"]
data = [225, 90, 50, 60, 100, 5]
wedges, texts = ax.pie(data, wedgeprops=dict(width=0.5), startangle=-40)
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(xycoords='data', textcoords='data', arrowprops=dict(arrowstyle="-"), bbox=bbox_props, zorder=0, va="center")
for i, p in enumerate(wedges):
ang = (p.theta2 - p.theta1)/2. + p.theta1
y = np.sin(np.deg2rad(ang))
x = np.cos(np.deg2rad(ang))
horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
connectionstyle = "angle,angleA=0,angleB={}".format(ang)
kw["arrowprops"].update({"connectionstyle": connectionstyle})
ax.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
horizontalalignment=horizontalalignment, **kw)
ax.set_title("Matplotlib bakery: A donut")
plt.show()
Однако в этом примере кода не хватает ... (1) Метка для каждого клина - это отдельная строка, а не набор строк (именно это хранит карты в руке каждого игрока). (2) Я не могу контролировать цвет клиньев. (3) контур каждого клина черный, а не белый, который является фоновым цветом моего окна графического интерфейса. (4) Я хочу контролировать точное размещение этикеток. И наконец (5) мне нужно изменить шрифт / размер надписей. Кроме этого пример кода идеально подходит.
Просто отметьте, что фактический размер каждого клина на круговой диаграмме будет продиктован размером каждого из пяти наборов (таким образом, они будут составлять до 21).
На тот случай, если вам всем потребуется более существенный код для работы, вот пять наборов, которые составляют данные, необходимые для этой круговой диаграммы ...
player1_cards = {'Mustard', 'Plum', 'Revolver', 'Rope', 'Ballroom', 'Library'}
player2_cards = {'Scarlet', 'White', 'Candlestick'}
player3_cards = {'Green', 'Library', 'Kitchen', 'Conservatory'}
middle_cards = {'Peacock'}
unknown_cards = {'Lead Pipe', 'Wrench', 'Knife', 'Hall', 'Lounge', 'Dining Room, 'Study'}
Хорошо, что это, извините за довольно длинный пост, и спасибо за просмотр и ответ :))