前言用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中计算两个数相除的商和余数的运算符号是什么?
本文暂时没有评论,来添加一个吧(●'◡'●)