厉害了,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-
- 小程序开发工具全新上线 附下载地址和教程
- JS页面跳转代码怎么写?总结了5种方法
- finecms如何控制调用子栏目的数量
- finecms如何调用多个指定栏目的内容
- finecms同时调用子栏目和子栏目的文章怎么操作
- 群体智能算法-黏菌寻找食物最优路线行为模拟 2
- thinkcmf安装教程与目录结构详解 快速上手版
- finecms如何批量替换文章中的关键词?
- dedecms批量修改文章为待审核稿件怎么操作
- 群体智能算法-黏菌寻找食物最优路线行为模拟
- finecms设置伪静态后分享到微信不能访问怎么处理
- composer安装其实可以很简单 两行命令就解决了
- 章神的私房菜之数据预处理
- 如何调用finecms指定栏目的描述关键词
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 还在玩耍的你,该总结啦!(本周小结之二叉树)
- 二叉树:以为使用了递归,其实还隐藏着回溯
- 二叉树:做了这么多题目了,我的左叶子之和是多少?
- 对大文件字符进行计数
- 二叉树:我的左下角的值是多少?
- Linux网络配置和管理
- 二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?
- 二叉树:构造二叉树登场!
- RabbitMQ是如何确定消息是否投递到队列中的
- 图文并茂入门一下Git
- python教程 | 最标准的地图调用方式(国家测绘局提供数据)
- Linux的文件和文件系统的管理
- 38.opengl-字体渲染
- 使用Sentinel对Spring MVC接口进行限流
- IDEA Pycharm WebStorm JetBranis全版本 2020年 最新激活方式