【问题标题】:how to create PI chart in python如何在python中创建饼图
【发布时间】:2018-07-09 20:23:26
【问题描述】:

各位 Python 专家,

PI 图表无法很好地显示,因为列名较长且切片较小。在此示例中,您可以看到我有 6 个存储桶,但在 PI 图表中,只有 5 个切片可见。甚至标有切片(右上角)和顶部的文本也相互重叠。表格宽度也不足以容纳列内容。您能否建议处理这种情况的最佳方法是什么?我是python的新手。我正在使用 anaconda python 3.6。

代码:

import pandas as pd
import matplotlib.pyplot as plt
from pandas.tools.plotting import table

raw_data = {'FLAG' : ['AT-NBBO', 'BETTER-THAN-NBBO', 'ONE-SIDED-QUOTE', 'OUTSIDE-NBBO', 'OUTSIDE-NBBO-DUE-TO-OVERSIZED-BUT-NO-EXECUTION-WITHIN-NBBO', 'OUTSIDE-NBBO-DUE-TO-OVERSIZED-BUT-SOME-EXECUTION_WITHIN_NBBO'],
     'COUNT' : [10840, 8628, 84, 633, 153, 14]
   }
df = pd.DataFrame(raw_data, columns = ['FLAG', 'COUNT'])

plt.figure(figsize=(16,8))
ax1 = plt.subplot(121, aspect='equal')
df.plot(kind='pie', y = 'COUNT', ax=ax1, autopct='%1.1f%%', 
  startangle=90, shadow=False, labels=df['FLAG'], legend = True, 
fontsize=14)


# plot table
ax2 = plt.subplot(122)
plt.axis('off')
tbl = table(ax2, df, loc='right')
tbl.auto_set_font_size(False)
tbl.set_fontsize(20)
plt.show()

输出:

【问题讨论】:

  • 正如您之前对您之前(此版本相同)问题的评论:您希望情节看起来如何?也许您可以使用手绘草图或绘画程序来使其更清晰。另外,究竟 table 是什么?如果您的代码不完整且不可验证,则没有人可以运行您的代码,因此如果您想要关于 table 的解决方案,您需要共享创建它的函数。
  • @ImportanceOfBeingErnest,您是否尝试运行我的代码?这是一个完整的代码,并产生如上所示的输出。我删除了我以前的帖子,因为您已将其标记为重复,并且首先标记为未完成,因此创建了新帖子。表格显示了不适合表格的数据框的内容。这在我的输出中清晰可见。我不确定你到底在看什么?您是本论坛的版主吗?
  • 是的,我什至确实尝试过运行您的代码,尽管通过查看它已经很明显table 没有在任何地方定义,因此在运行它时会产生错误NameError: name 'table' is not defined。为了回答这个问题,你需要知道你希望你的情节是什么样子,而不是现在的样子。我不是版主,但我经常尝试向人们解释他们的问题需要什么才能回答(从我上面评论旁边的数字(5),你会看到有 5 人同意我的观点)。
  • @ImportanceOfBeingErnest,感谢您的建议。我不确定您为什么会收到错误消息。可能您的 python 版本与我的不同。我正在使用 Python3.6。我刚刚在上面的代码中添加了额外的导入。在我的代码中,您可以看到我有 6 个存储桶,但在 pi 图中只有 5 个可见。在该文本标签中,有 3 个切片(右上角)彼此重叠。在表格中,您还可以看到文本出现在表格宽度之外。您能帮我找到解决问题的方法吗?
  • 因为您现在使此代码可运行(包括所有需要的导入)我现在可以从问题中重现图像。失踪的“水桶”确实在剧情中,但与其他相比,它是如此之小,以至于几乎无法观察到。所以这又引出了一个问题,你希望你的情节看起来如何?桌子也一样;您希望长标签如何适合桌子?您想减小字体大小以使其适合,还是想要更大的表格?

标签: python python-3.x pandas matplotlib anaconda


【解决方案1】:

关于表格,您可以调整两个子图的比例和子图边距,为表格腾出更多空间。然后你也可以改变表格的列宽比。

import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import table

raw_data = {'FLAG' : ['AT-NBBO', 'BETTER-THAN-NBBO', 'ONE-SIDED-QUOTE', 'OUTSIDE-NBBO', 'OUTSIDE-NBBO-DUE-TO-OVERSIZED-BUT-NO-EXECUTION-WITHIN-NBBO', 'OUTSIDE-NBBO-DUE-TO-OVERSIZED-BUT-SOME-EXECUTION_WITHIN_NBBO'],
     'COUNT' : [10840, 8628, 84, 633, 153, 14]
   }
df = pd.DataFrame(raw_data, columns = ['FLAG', 'COUNT'])


fig, (ax1,ax2) = plt.subplots(ncols=2,figsize=(16,6), 
      gridspec_kw={"width_ratios":[1,2.]})
fig.subplots_adjust(left=0.05, right=0.97, wspace=0.4)
ax1.set_aspect("equal")
df.plot(kind='pie', y = 'COUNT', ax=ax1, autopct='%1.1f%%', 
  startangle=90, shadow=False, labels=df['FLAG'], legend = True, 
fontsize=14)

ax2.axis("off")
tbl = table(ax2, df, loc='center',colWidths=[0.9,0.10])
print tbl
tbl.auto_set_font_size(False)

plt.show()

【讨论】:

  • 谢谢。桌子现在看起来很完美。 PI 图表标签(右上角)相互重叠。有没有办法通过调整高度来解决?如果没有,那么我可以摆脱标签并在图例中显示百分比吗?
  • 谢谢。通过遵循该建议,我尝试了类似下面的方法,但它并没有在图例中给出正确的百分比,因为它出现在图表上。我不想在图表上显示标签和百分比,因为文本由于长字符串和小切片而重叠。 df.plot(kind='pie', y = 'COUNT', ax=ax1, autopct='%1.1f%%', startangle=90, shadow=False, labels=['%s, %1.1f %% ' % (l, s) for l, s in zip(df['FLAG'],df['COUNT'])], legend = True, fontsize=20)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2020-02-23
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
相关资源
最近更新 更多