厉害了,Matplotlib还能这样画散点图!
在数据可视化中,二维散点图的应用范围很广,比如用来观测两个变量之间的相关性、展示销量的的走势等等,这些是散点图的常规用法。
然而,这篇文章想讲的是,二维散点图能够展现的信息远不止两个维度。Matplotlib
进阶绘图的第二篇文章,带你扒一扒散点图都有哪些妙用。
本文用的数据集是加州房产价格数据集,每个样本代表一个街区。数据集中共有10个属性,包含经度、纬度、房屋年龄中位数、总房间数、总卧室数、人口数、家庭数、收入中位数、房屋价值中位数和该地区离大海的距离。
首先,将经度视为x
,纬度作为y
,绘制散点图,我们可以得到这些街区的地理位置分布图。
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_csv('./data/housing.csv')
fig,ax = plt.subplots(figsize=(9,6))
ax.scatter(x='longitude',y='latitude',data=data)
散点图大致的勾勒出了加州的地理轮廓,一个点代表了一个街区。
但这张图反映不出街区之间的密集程度,原因在于,一个街区的面积相对于一个州的面积而言几乎可以忽略不计,所以很多时候两个街区在经纬度上相差不大,在图上的表现就是重叠成一个点。
针对这个问题,可以设置alpha
参数,控制散点的透明度,设置了透明度之后,颜色越深的部分就代表了越多的散点在这里重叠,即该区域的街区密集程度更大,如下
fig,ax = plt.subplots(figsize=(9,6))
# alpha取值在0-1之间,具体取何值取决于对密集程度的定义,这里取0.3
ax.scatter(x='longitude',y='latitude',data=data,alpha=0.3)
所以通过alpha
(透明度)的设置,在散点图上非常直观地展示了街区密集程度这一信息。
接着,我们可以看看各个街区的人口分布情况,如何做呢?
图中一个点代表了一个街区,所以需要对散点的样式进行设置,散点的可以设置的属性有颜色,大小,形状等。
实际选择哪种视实际情况(效果,研究目的)而定,这里选用大小来反映街区的人口数量,即设置参数s
,将散点的大小和人口多少挂钩。为了便于对比,将设置前后的图放到了一起。
fig,ax = plt.subplots(1,2,figsize=(20,6))
ax[0].scatter(x='longitude',y='latitude',data=data,alpha=0.3)
ax[0].set_title('设置前',size=16)
ax[1].scatter(x='longitude',y='latitude',data=data,alpha=0.3,s=data['population']/100,label='population')
ax[1].set_title('设置后',size=16)
可以看到,对于加州北部(黄色框内)而言,不仅街区密度不大,而且街区内的人也较少(散点较小)。同时,对于红色框内的区域,虽然街区密度较大,但人口密度明显稀疏不少。
最后,结合街区密集度和人口密集度,再看看各个街区的价格分布,这里将颜色和房价高低挂钩,通过颜色的渐变来展现房价高低,颜色由蓝到红代表了价格由低到高,具体用到的参数为c
。
fig,ax = plt.subplots(figsize=(9,6))
ax_plot = ax.scatter(x='longitude',y='latitude',alpha=0.4,s=data['population']/100,
c='median_house_value',cmap=plt.get_cmap('jet'),data=data)
# 加上颜色棒
fig.colorbar(ax_plot,ax=ax)
通过对颜色的设定,整个图看上去颜值高了很多,同时,也可以得到一些结论:
房价比较高的区域集中于两个中心,且都靠近海湾 房价高的地方对应的人口密集度也较高
虽然这两个数据分析的结论比较显而易见,但这里主要想说的是,用散点图也能够展现出丰富的信息,在这个案例中,用alpha
呈现了街区密集度,s
呈现了人口密集度,c
反映房价高低,再加上横纵坐标的经纬度,一共反映了5个维度的信息。
所以,二维散点图还是很强大的对吧!只要掌握一些常用的参数设置,理清数据分析思路,你的散点图便可以变得既富有信息量,还有高颜值。
-END-