饼图绘制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了饼图绘制相关的知识,希望对你有一定的参考价值。

参考技术A 一、用途及参数介绍

展示分类数据的占比情况。

plt.pie(x,labels,autopct,shadow,startangle)

x绘图用到的数据

labels用于设置饼图中每个扇形外侧的显示说明的文字

autopct设置饼图中的百分比数据,可以使用format字符串,或format function,‘%.2f%%’指保留两位百分小数

shadow 表示是否在饼图下画阴影,默认是False,

startangle  设置起始角度,默认是从x轴正方向起始。如果设置startangle=90,则从x轴正方向起始。

二、绘制简易饼图

1、开启jupyter notebook的matplotlib支持

%matplotlib inline

2、导包

from matplotlib import pyplot as plt

from matplotlob imprort font_manager

3、自定义字体

myfont=font_manager.FontProperties('字体目录+位置')

4、准备数据

x=[]

5、准备画布

plt.figure(figsize=(20,8),dpi=80)

6、绘制饼图(饼图数据不用tolist,柱状图数据需要tolist())

x=df.groupby('列标').size()

plt.pie(x)

7、显示图形

plt.show()

三、丰富、美化饼图

1、添加labels

plt.pie(x,labels=x.index)

2、添加百分数

plt.pie(x,labels=x.index,autopct='%.2f%%')

3、设置开始的扇区

plt.pie(x,labels=x.index,autopct='%.2f%%',startangle=90)

无法绘制饼图

【中文标题】无法绘制饼图【英文标题】:unable to plot a pie chart 【发布时间】:2018-12-27 03:54:21 【问题描述】:

我有一个纪元纳秒的数据集

       M            d          time      
0  1081083  28000000000  1.530683e+18  
1  1081083  16000000000  1.530683e+18  
2  1081085  33000000000  1.530683e+18  
3  1081083  28000000000  1.530683e+18  
4  1081085  27000000000  1.530683e+18

转换后的样子是这样的:

      M         d           time
0  1081083  07:16:40 2018-07-04 05:42:20  
1  1081083  09:56:40 2018-07-04 05:43:03  
2  1081085  16:10:00 2018-07-04 05:43:12  
3  1081083  07:16:40 2018-07-04 05:43:51  
4  1081085  05:30:00 2018-07-04 05:44:01

将纪元转换为正常的代码是:

import pandas as pd
import time
import matplotlib.pyplot as plt


df1 = pd.read_csv('testsy_1.csv')

df1['time']=pd.to_datetime(df1['time'], unit='ns')

df1['d']=df1['d'].apply(lambda x: time.strftime("%H:%M:%S",time.localtime(x)))

但是当尝试获取 df1['M'],df1['d'] 的饼图时:

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

我得到一个错误:

TypeError: Empty 'DataFrame': no numeric data to plot

由于转换后的数据已经存在,数据框如何为空?如何在此处绘制饼图?

按照@jezrael 的建议,我省略了df1['d']=df1['d'].apply(lambda x: time.strftime("%H:%M:%S",time.localtime(x))) 并执行了脚本,没有任何更改,为我获取数据集的 df.head() 的结果。

但是当将上述内容应用于大约 23000 行的完整数据集时,我得到了一个可怕的情节......有什么问题?

【问题讨论】:

【参考方案1】:

有问题d 值不是数字。

因此您可以将d 列转换为时间增量,然后转换为秒:

df1['d'] = pd.to_timedelta(df1['d']).dt.total_seconds()
print (df1)
         M        d                time
0  1081083  26200.0 2018-07-04 05:42:20
1  1081083  35800.0 2018-07-04 05:43:03
2  1081085  58200.0 2018-07-04 05:43:12
3  1081083  26200.0 2018-07-04 05:43:51
4  1081085  19800.0 2018-07-04 05:44:01

或者如果可能的话省略:

df1['d']=df1['d'].apply(lambda x: time.strftime("%H:%M:%S",time.localtime(x)))

【讨论】:

省略 df1['d']=df1['d'].apply(lambda x: time.strftime("%H:%M:%S",time.localtime(x))) 有效,对 23000 行应用相同的策略不会给出令人愉快的饼图。请查看主要问题部分,我也更新了 23000 行的饼图屏幕截图。 @jezrael 哪里需要改变? @suryarahul - 在我看来,问题在于逻辑 - 您为 DataFrame 的每一行绘制一个饼图。所以有可能像df = df.groupby('M', as_index=False)['d'].sum() 这样的聚合数据然后绘图。 df = df.groupby('M', as_index=False)['d'].sum() 是指每一行还是行的总和? @jezrael @suryarahul - 是的,想法是创建更少的行,因为可以将 23k 行绘制成饼图,但结果很糟糕 表示df = df.groupby('M', as_index=False)['d'].sum() 将给出行的聚合结果。一个问题@jezrael 如何将任何特定行绘制为饼图?

以上是关于饼图绘制的主要内容,如果未能解决你的问题,请参考以下文章

自定义UI 绘制饼图

自定义UI 绘制饼图

自定义UI 绘制饼图

QT绘制饼图

饼图绘制

Matplotlib-绘制饼图