这是“简洁优雅的Matplotlib可视化”栏目的第 3
上一期我们讲解了用plt.plot()函数绘制线形图的要领。类似地,plt.plot()函数还可以绘制漂亮的散点图哦。此外,本节还会讲到另一个绘制散点图的魔法函数。
想要学习更多的Python可视化魔法,就请关注、收藏、转发吧!
plt.plot绘制散点图
用plt.plot()函数绘制散点图的方法很简单,举个例子就一目了然:
x = np.linspace(0, 10, 30)
y = np.sin(x)
plt.plot(x, y, 'o',color = 'black')
示例中,函数的第三个参数是一个字符,表示图形符号的类型。与之前用‘-’和‘--’设置线条属性类似。所有的缩写形式都可以在plt.plot文档中查到。绝大多数图形标记都非常直观,我们在这里演示一部分。
# 不同的图形标记
组合线条与散点
这些代码还可以与线条、颜色代码组合起来,画出一条连接散点的线。
plt.plot(x, y, '-ok') # 直线(-),圆圈(o),黑色(k)
另外,plt.plot支持许多设置线条和三点属性的参数。
x = np.linspace(0, 10, 30)
y = np.sin(x)
plt.plot(x, y, '-s', color = 'black',
markersize = 15, linewidth = 1,
markerfacecolor = 'white',
markeredgecolor = 'red',
markeredgewidth = 1)
plt.ylim(-1.2, 1.2)
用plt.scatter画散点图
另一个可以创建散点图的函数是plt.scatter(),这个函数也是开头提到的魔法函数。为什么说plt.scatter()是魔法函数呢?因为这个函数的功能超乎想象地强大,但其用法却与plt.plot()类似。举个简单的例子:
plt.scatter(x, y, marker = 'o')
plt.scatter()与plt.plot()的主要区别在于,前者在创建散点图时具有更高的灵活性,可以单独控制每个散点与数据匹配,也可以让每个散点具有不同的属性(大小、表面颜色、边框颜色等)。
下面创建一个随机散点图,里面有各种颜色和大小的散点。为了能更好地显示重叠部分,用alpha参数来调整透明度。
# 改变散点的大小、颜色、透明度
rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000 * rng.rand(100)
# 绘制散点图
plt.scatter(x, y, c = colors, s = sizes,
alpha = 0.3, cmap = 'viridis')
# 显示颜色条
plt.colorbar()
注:颜色自动映射成颜色条(color scale,通过colorbar()显示),散点的大小以像素为单位。
在绘制散点图时,效率因素也决定着我们在实际绘制散点图时,到底选用plt.scatter()函数还是plt.plot()函数。当数据量较小的时候,两者在效率上的差别不大。但是当数据变大到几千个散点时,plt.plot的效率会大大高于plt.scatter。
这是由于plt.scatter会对每个散点进行单独的大小与颜色渲染,因此渲染器会耗费更多的资源。而在plt.plot中,散点基本都彼此复制。因此,整个数据集中所有点的颜色、尺寸只需要配置一次。
由于这两种方法在处理大型数据集时有很大的性能差异,因此面对大型数据集时,plt.plot方法比plt.scatter方法好。
***本期案例***
终于又到今天的案例环节啦!这期给小伙伴们分享一个实战案例——绘制北京地铁刷卡进站量的空间分布图。
我用到三种数据,分别是:
- 北京地铁线路的地理信息数据
- 北京地铁各站点经纬度
- 各地铁站的刷卡进站量
直接看代码:
# 调用程序包
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 创建图像(设置图片大小)
fig = plt.figure(figsize=(11,12))
# ———————绘制北京地铁图—————————————————
# 绘制地铁线路
### 数据描述:
### 每条地铁线路的地理信息数据占文档中的一行,格式如下:
### "lon1,lon2,…,lonn";"lat1,lat2,…,latn"
with open('C:/Users/王婷/Desktop/bj_sub.txt','r') as f:
for i in f:
hang = i.strip('n').split(';')
x = hang[0].strip('"').split(',')
y = hang[1].strip('"').split(',')
lon_s = []
lat_s = []
for n in range(0,len(x)):
lon_s.append(float(x[n]))
lat_s.append(float(y[n]))
plt.plot(lon_s, lat_s, '-',color = '0.25',
linewidth = 1, alpha = 0.5,)
# 绘制地铁站点
dtz = pd.read_csv('bj_sub_st.csv')
lat_st, lon_st = dtz['lat'], dtz['lon']
plt.scatter(lon_st,lat_st, label = None,c = 'k',
alpha = 0.75, s = 1)
# ———————绘制大小点———————————————————
# 用Pandas读取csv格式的数据
sj = pd.read_csv('Mum_of_In.csv')
# 数据的提取
pop = sj['pop']
lat, lon = sj['lat'], sj['lon']
# 绘制散点(参数调至图片好看即可)
plt.scatter(lon, lat, label = None,
c = np.log10(pop), cmap = 'RdBu_r',
linewidth = 1, alpha = 0.5,
s = pop/300)
# 设置颜色条
plt.colorbar(label = 'log$_{10}$(population)')
plt.clim(3.3,5) # 调整颜色区间对应的数据范围
# ———————————————————————————————
# 设置坐标轴
plt.xlabel('longitude')
plt.ylabel('latitude')
plt.xlim(115.95,116.8)
plt.ylim(39.6,40.3)
# 创建一个图例
for pop in [10000, 30000, 50000]:
plt.scatter([], [], c = 'k',alpha = 0.3,
s = pop/300,
label = str(pop))
plt.legend(scatterpoints = 1,
frameon = False,
labelspacing = 3,
title = 'Population')
# 显示图片
plt.show()
fig.savefig('案例图片.png')
代码三次用到今天讲述的plt.scatter()函数。
第一次:绘制地铁站的位置;
第二次:绘制各个站点的进站刷卡量(population);
第三次:绘制图例。
还出现了plt.plot()函数——用以绘制地铁线路图。此外,还用到了用Pandas读取CSV文件,和读取TXT文档的知识。
需要注意的是,在实战案例中,要根据经验灵活地调整plt.plot和plt.scatter的参数。尤其是plt.scatter中“散点大小”和“散点颜色”两个参数,要多尝试几组不同的设置方案,以求图案美观、清晰。散点的色调和颜色的深浅可通过配置颜色条改变,这一知识点会在以后的推送进行深入讲解。
下面就是画图的最终结果啦!
蓝色散点表示的地铁站通常进站刷卡量通常比较大,而红色散点表示的地铁站通常进站刷卡量较小。由于小编采用的是2018年的刷卡数据,此时6号线西段和8号线南段尚未开通,因此图中这两条线路的进站刷卡量为零。