编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

python100天 63 pie 函数画饼图继续探索

wxchong 2024-06-27 01:51:20 开源技术 13 ℃ 0 评论

前言用Excel打开 100多兆的CSV文件:london2016年之前一些犯罪数据



原本以为把pie函数画饼图的效果基本都摸索的差不多了

其实还是有很多用法的


画这图的过程其实就涉及到了一很重要的问题::数据从哪里来

这里面是从kaggle网站下载 的一个100多 crime lsoa

使用pandas读取这100 M大小 的csvn文件,看起来没有太大压力,可能是硬件内存足够了。其实语言本身的性能在这样的数据量情况下,其实已经可以忽略了。pandas其实已经 够强悍了。


import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
df = pd.read_csv('z_kaggle_archive/london_crime_by_lsoa.csv')

print(df.head())
     lsoa_code borough major_category ... value year month
0   E01001116 Croydon Burglary ... 0 2016 11
1   E01001646 Greenwich Violence Against the Person ... 0 2016 11
2   E01000677 Bromley Violence Against the Person ... 0 2015 5
3   E01003774 Redbridge Burglary ... 0 2016 3
4   E01004563 Wandsworth Robbery ... 0 2008 6

看前面5条数据,可以看到这个csv的数据结构,每一列的函数

使用pandas对数据进行处理 :pandss等本人专门学习的时候在详细介绍

df = df[['borough', 'major_category']]
df_grouped = df.groupby(['borough', 'major_category']).size().reset_index()
table = pd.pivot_table(df_grouped, index=['borough'], columns=['major_category'])
table = table.dropna(axis=1).astype(int)

row_num = [5] # No. of the row
font_color = '#525252'
colors = ['#f7ecb0', '#ffb3e6', '#99ff99', '#66b3ff', '#c7b3fb','#ff6666', '#f9c3b7']
values = table.iloc[row_num].values.tolist()[0] # crime numbers
labels = [x[1] for x in table.columns] # crime names
title = table.iloc[row_num].index.values.tolist()[0] # borough

接着对上面的加工后的数据进行画图::属于饼图pie函数的范畴了

fig, ax = plt.subplots(figsize=(10, 7), facecolor='#e8f4f0')
ax.pie(values, labels=labels, colors=colors, startangle=30, textprops={'color':font_color})
title = plt.title(title, fontsize=16, color=font_color)
title.set_position([.5, 1.02])
mpl.rcParams['font.size'] = 10.0
filename = 'pie-chart-single'
plt.savefig(filename+'.png', facecolor=('#e8f4f0'))
font_color = '#525252'
colors = ['#f7ecb0', '#ffb3e6', '#99ff99', '#66b3ff', '#c7b3fb','#ff6666', '#f9c3b7']

fig, axes = plt.subplots(3, 3, figsize=(20, 20), facecolor='#e8f4f0')
fig.delaxes(ax= axes[2,2])
  • 由于要画多个饼图因此使用的是 subplots来生成多个子plot进行绘制
  • fig, ax = plt.subplots(figsize=(10, 7), facecolor='#e8f4f0')
  • ax.pie(values, labels=labels, colors=colors, startangle=30, textprops={'color':font_color})

这里我们用的是ax.pie而不是plt.pie函数了

绘制多个饼 图

for i, (idx, row) in enumerate(table.head(8).iterrows()):
        ax = axes[i // 3, i % 3]
        row = row[row.gt(row.sum() * .01)]
        ax.pie(row,
                  labels=row.values,
                  startangle=30,
                  wedgeprops=dict(width=.5), # For donuts
                  colors=colors,
                  textprops={'color':font_color})

        ax.set_title(idx, fontsize=10, color=font_color)

        legend = plt.legend([x[1] for x in row.index],
                      bbox_to_anchor=(1.3, .87),  
                      loc='upper left',
                      ncol=1,
                      fancybox=True)
        for text in legend.get_texts():
        			plt.setp(text, color=font_color)  
        
        
fig.subplots_adjust(wspace=.1) # Space between charts
title = fig.suptitle('Categories of crime in London boroughs', y=.95, fontsize=20, color=font_color)
 
plt.subplots_adjust(top=0.85, bottom=0.25)
filename = 'pie-chart'
plt.savefig(filename+'.png', facecolor=('#e8f4f0'))
plt.show()
  • for i, (idx, row) in enumerate(table.head(8).iterrows()): 主要是生成多个饼图
  • 核心代码:就是根据前面pandas生成的数据,来画对应 的n个饼图



  • 饼图的样式和外观


最后距离的问题,下期我们将前面的pie函数的例子中的代码录个视频进行说明

for i, (idx, row) in enumerate(table.head(8).iterrows()):
        ax = axes[i // 3, i % 3]

这段代码的作用是什么?给大家以下两点提示

  • 8组数据,要分成3行显示,那么每个subplot的位置是什么?
  • python中计算两个数相除的商和余数的运算符号是什么?

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表