python中散点图如何画出非常平滑曲线 python散点图点的大小怎么调_数据集


这是“简洁优雅的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')


python中散点图如何画出非常平滑曲线 python散点图点的大小怎么调_图例_02


示例中,函数的第三个参数是一个字符,表示图形符号的类型。与之前用‘-’和‘--’设置线条属性类似。所有的缩写形式都可以在plt.plot文档中查到。绝大多数图形标记都非常直观,我们在这里演示一部分。


# 不同的图形标记


python中散点图如何画出非常平滑曲线 python散点图点的大小怎么调_数据_03


组合线条与散点

这些代码还可以与线条、颜色代码组合起来,画出一条连接散点的线。


plt.plot(x, y, '-ok') # 直线(-),圆圈(o),黑色(k)


python中散点图如何画出非常平滑曲线 python散点图点的大小怎么调_数据集_04


另外,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)


python中散点图如何画出非常平滑曲线 python散点图点的大小怎么调_数据_05


用plt.scatter画散点图

另一个可以创建散点图的函数是plt.scatter(),这个函数也是开头提到的魔法函数。为什么说plt.scatter()是魔法函数呢?因为这个函数的功能超乎想象地强大,但其用法却与plt.plot()类似。举个简单的例子:


plt.scatter(x, y, marker = 'o')


python中散点图如何画出非常平滑曲线 python散点图点的大小怎么调_数据_06


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()


python中散点图如何画出非常平滑曲线 python散点图点的大小怎么调_数据集_07


注:颜色自动映射成颜色条(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中“散点大小”和“散点颜色”两个参数,要多尝试几组不同的设置方案,以求图案美观、清晰。散点的色调和颜色的深浅可通过配置颜色条改变,这一知识点会在以后的推送进行深入讲解。

下面就是画图的最终结果啦!


python中散点图如何画出非常平滑曲线 python散点图点的大小怎么调_图例_08


蓝色散点表示的地铁站通常进站刷卡量通常比较大,而红色散点表示的地铁站通常进站刷卡量较小。由于小编采用的是2018年的刷卡数据,此时6号线西段和8号线南段尚未开通,因此图中这两条线路的进站刷卡量为零。