首先当然要引入必要的库。本例中,我们要用到Pandas,matplotlib中的pyplot,numpy以及folium,按照管理,使用pd,plt和np作为几个库的别名(在自己写程序命名变量时最好避开这些约定俗成的变量。示例使用Ipython,请安装jupyter notebook及下列库文件以运行程序。
import pandas as pd #import pandas
import matplotlib.pyplot as plt
import numpy as np
import folium
1. 数据科学,柱状图绘图示例
使用一个简单的Excel 表格作为示例(下载地址 ),如果表格不好下载,也可以直接复制下方内容并另存为csv文件。
svdata=pd.read_csv("Topic_Survey_Assignment.csv",index_col=0) #read downloaded csv file with the first col as index
svdata.head(6)
Very interested Somewhat interested Not interested
Big Data (Spark / Hadoop) 1332 729 127
Data Analysis / Statistics 1688 444 60
Data Journalism 429 1081 610
Data Visualization 1340 734 102
Deep Learning 1263 770 136
Machine Learning 1629 477 74
总数据量为2233,计算比例并进行排序。
totalsample=2233
svdatasorted=svdata.sort_values(by="Very interested",ascending =False)
svdatarate=(svdatasorted/totalsample).round(2)
svdatarate.head(6)
以下程序对数据进行绘图显示。绘图时采用了以下技巧。
- 使用了柱状图 barchart
- 图例等字体大小设置为14,标题字体16
- 柱状图宽图设置为0.8
- 按照Very Interested 降序排列
- 指定不同柱状图颜色
- 去掉上方及左右边框但保留底部边框
barwidth=0.8
xs=[round(x*3.2,2) for x in range(0, 6)]
xs2=[x+0.8 for x in xs]
xs3=[x+1.6 for x in xs]
font1 = {'family': 'Arial', 'weight': 'normal', 'size': 14}
plt.figure(figsize=(20,8))
l1=plt.bar(xs, svdatarate.iloc[:,0], barwidth, color='#5cb85c')
l2=plt.bar(xs2, svdatarate.iloc[:,1], barwidth, color='#5bc0de')
l3=plt.bar(xs3, svdatarate.iloc[:,2], barwidth, color='#d9534f')
plt.legend(handles=[l1, l2, l3], labels=['Very interested', \
'Somewhat interested','Not interested'], loc='best',prop=font1)
plt.title('Percentage of Respondents’ Interest in Data Science Areas',fontsize=16)
plt.xticks(xs2, svdatarate.index,fontsize=14)
plt.yticks(np.arange(0, 1.1, 0.1),fontsize=14)
for a,b in zip(xs,svdatarate.iloc[:,0]):
plt.text(a, b+0.02, '%.0f%%' % (b*100), ha='center', va= 'bottom',fontsize=14)
for a,b in zip(xs2,svdatarate.iloc[:,1]):
plt.text(a, b+0.02, '%.0f%%' % (b*100), ha='center', va= 'bottom',fontsize=14)
for a,b in zip(xs3,svdatarate.iloc[:,2]):
plt.text(a, b+0.02, '%.0f%%' % (b*100), ha='center', va= 'bottom',fontsize=14)
for spine in plt.gca().spines.values():
spine.set_visible(False)
plt.gca().spines['bottom'].set_visible(True)
plt.tick_params(top=False, bottom=True, left=False, right=False, labelleft=False, labelbottom=True)
plt.show()
绘图效果如下
屏幕快照 2019-02-04 17.00.12.png
2. Python与地理信息系统结合绘图
以旧金山地区犯罪率为例,将旧金山各个区的犯罪率通过地理信息系统显示出来,本例需要历史犯罪数据的excel格式文档(下载地址)以及旧金山地区的地理信息数据geojson文件(下载地址),如果暂时无法下载文件请访问本文作者个人网站搜索相应文章并进行下载即可。
crimecsv=pd.read_csv("Police_Department_Incidents_-_Previous_Year__2016_.csv",index_col=0)
crimecsv.head(6)
以下代码对读取到的犯罪文件按照区域进行归类技术,并修改了列名称。处理之后的数据示例如下。
crimedata=crimecsv['Category'].groupby(crimecsv['PdDistrict']).count().to_frame()
#crimegroupsum.columns=['Neighborhood','Count']
crimedata['ls']=range(len(crimedata))
crimedata['Neighborhood'] = crimedata.index
crimedata.rename(columns={"Category":"Count"},inplace=True)
crimedata.set_index(['ls'],inplace=True)
crimedata=crimedata.reindex(columns=list(('Neighborhood','Count')))
del crimedata.index.name
crimedata
Neighborhood Count
0 BAYVIEW 14303
1 CENTRAL 17666
2 INGLESIDE 11594
3 MISSION 19503
4 NORTHERN 20100
5 PARK 8699
6 RICHMOND 8922
7 SOUTHERN 28445
8 TARAVAL 11325
9 TENDERLOIN 9942
最后,结合folium地理信息库进行绘图,本示例就绘图进行了如下演示说明:
- 采用了folium图形库中的choropleth图形,用于将不同等级标示为不同图形
- 缩放从12级开始,图形中心是旧金山市
- 读取数据级geojson文件,并将两者对应(选择数据文件中Neighborhood,Count列并与geojson文件中feature.properties.DISTRICT 对应)
- 指定绘图颜色YlOrRd
- 指定填充密度0.7,线密度0.2
sf_map = folium.Map(location=[37.77,-122.42], zoom_start=12)
sf_geo = r'san-francisco.geojson'
sf_map.choropleth(
geo_data=sf_geo,
data=crimedata,
columns=['Neighborhood', 'Count'],
key_on='feature.properties.DISTRICT',
fill_color='YlOrRd',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Crime Rate in San Francisco'
)
sf_map
最终绘图效果示意如下
屏幕快照 2019-02-04 16.16.35.png
网友评论