Matplotlib和饼图/甜甜圈图标签

时间:2018-07-06 04:21:56

标签: python-3.x matplotlib

如果yall看到了我以前的问题,那么我正在编写一个Python程序来评估我在玩Clue游戏时收集的数据。我决定在程序中实现一个GUI(tkinter),以使其更快,更轻松地使用。 GUI的主窗口之一显示了我知道每位玩家手中拥有的不同卡牌,我知道这些卡牌必须位于“谋杀卡牌”的中间,而未知的卡牌则无法确定地放在上述类别中。我决定通过matplotlib饼图来实现这些数据,每个前述类别有五个楔形。

现在,我不关心如何在tkinter小部件中实现此matplotlib函数。我只专注于图表的设计。

到目前为止,我已经在字典中记录了每个玩家手中的卡,其中键是玩家名称,值是他们手中的一组卡。例如...

player_cards = { 'player1':{'Mustard', 'Scarlet', 'Revolver', 'Knife', 'Ballroom', 'Library'}, 'player2':{}, 'player3':{} }

因此,将从图表中提取饼图的前三个楔形的数据。对于其他两个楔形,数据将存储在类似组织的集合中。

浏览matplotlib.org网站后,我看到了一个示例,该示例演示了我正在寻找的东西...

enter image description here

带有代码...

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)每个楔形的轮廓是黑色,而不是白色,这是我的GUI窗口的背景色。 (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'}

好的,很抱歉,我发表了一篇较长的文章,并感谢您查看和回复:)

0 个答案:

没有答案