数据可视化,更多拓展图形的绘制,以及如何引入本地数据集
使用 Matplotlib 和 Seaborn 进行画图,包括
箱线图
热力图
雷达图
二元变量分布
成对关系
箱线图(boxplot)又称盒式图,可以显示数据的分散情况,由五个数值点组成:最大值(max)-上界、最小值(min)-下界、中位数(median)和上下四分位数(Q1, Q3)。它可以帮我们分析出数据的差异性、离散程度和异常值等。
# 数据准备
# ⽣成0-1之间的10*4维度数据(10行,4列的数组)
import numpy as np
data = np.random.normal(size=(10,4))
lables = ['A', 'B', 'C', 'D']
# ⽤Matplotlib画箱线图
# boxplot(x,labels=None)函数,x代表绘图数据,labels是缺省值,可以为箱线图添加标签。
import matplotlib.pyplot as plt
plt.boxplot(data, labels=lables) #注意单词labels和lables
plt.show()
# ⽤Seaborn画箱线图
# boxplot(x=None,y=None,data=None)函数。data为DataFrame类型,x、y是data中的变量。
import seaborn as sns
import pandas as pd
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()
运行结果:
热力图(heat map)是一种矩阵表示方法,其中矩阵中的元素值用颜色来代表,不同的颜色代表不同大小的值。通过颜色的深浅就能直观地知道某个位置上数值的大小。另外也可以某个位置上的颜色与其他位置颜色进行比较,是一种非常直观的多元变量分析方法。
一般使用Sarborn中的sns.heatmap(data)函数绘制,我们使用Seaborn中自带的数据集flights,该数据集记录了1949年到1960年期间,每个月的航班乘客的数量。一般可能会出网络问题导致的失败。
下载地址:
https://github.com/mwaskom/seaborn-data
代码改进,将下载的数据引入进来:
数据透视表
改进代码和运行结果如下:
雷达图(radar chart)是以从同一点开始的轴上表示的三个或多个变量的图表的形式,也是显示一对多关系的方法。在雷达图中,一个变量相对于另一个变量的显著性清晰可见。
如果我们制作一张影响购买手机的因素分析图,我们通过收集问卷采访顾客对品牌,价格,外观,硬件,拍照,电量几个方面进行打分,将统计好的因素比重用雷达图表示出来。这里使用 Matplotlib 进行画图,首先设置两个数组:items
和scores
,它们分别保存了购买因素的名称和分数。
雷达图的边框是⼀个圆形,需要计算每个坐标的角度,然后对这些数值进行设置。当画完最后⼀个点后,需要与第⼀个点连线。
因为需要计算角度,所以我们要准备angles数组;又因为需要设定统计结果的数值,所以我们要设定scores数组。并且需要在原有angles和scores数组上增加⼀位,也就是添加数组的第一个元素。
# 数据准备
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 显示中文字体•
items = np.array([u"品牌", u"价格", u"外观", u"硬件", u"拍照", u"电量"]) # u:unicode
scores= [88, 92, 70, 78, 79, 82]
# 画图数据准备,⻆度、score和angles的状态值
angles=np.linspace(0, 2*np.pi, len(items), endpoint=False) #分割圆周长
scores=np.concatenate((scores,[scores[0]]))
# concatenate:拼接,在原有的score和angles上加一
angles=np.concatenate((angles,[angles[0]]))
# ⽤Matplotlib画蜘蛛图
fig = plt.figure() # 创建一个空白画布对象,添加子图可以将画板分成一行一列,形成一个绘图区
ax = fig.add_subplot(111, polar=True) #设置字画布,极坐标系:True
ax.plot(angles, scores, 'o-',linewidth=2) #连线
ax.fill(angles, scores, alpha=0.25) #上色
ax.set_thetagrids(angles * 180/np.pi, items) #写上标签
plt.show()
运行结果:
如果我们想要看两个变量之间的关系,就需要用到二元变量分布。二元变量分布有多种呈现方式,之前讲解的散点图就是一种二元变量分布。
在Seaborn里,使用二元变量分布非常方便,直接用sns.jointplot(x, y, data=None, kind)
函数即可。kind表示不同的视图类型:“kind=‘scatter’”代表散点图,“kind=‘kde’”代表核密度图,“kind=‘hex’ ”代表Hexbin图,它代表的是有六边形的单元画出的二维直方图的模拟。
我们在演示中使用Seaborn自带的数据集tips,这个数据集记录了不同顾客在餐厅的消费账单及小费情况。代码中total_bill保存了客户的账单金额,tip是该客户给出的小费金额。我们可以用Seaborn中的jointplot
来探索这两个变量之间的关系。
# 数据准备
import seaborn as sns
tips = sns.load_dataset("tips")
print(tips.head(10)) # head将表格中的第一行取作列名,然后取10行数据
# ⽤Seaborn画二元变量分布图(散点图,核密度图,Hexbin图)
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')
plt.show()
同样报错,我们使用相同方式把数据引入进来。数据都到本地了,怎么玩还不是看你的思维么?所谓自己动手丰衣足食!!
运行结果如下:
如果想要探索数据集中的多个成对双变量的分布,可以直接采⽤sns.pairplot()
函数。它会同时展示出DataFrame中每对变量的关系,另外在对角线上,能看到每个变量本身作为单变量的分布情况。pairplot()是探索性分析中的常用函数,可以很快帮我们理解变量对之间的关系。
我们使用Seaborn中自带的iris鸢尾花数据集。
鸢尾花可以分成:
Setosa
Versicolour
Virginica三个品种
在这个数据集中,针对每⼀个品种,都有50个数据,每个数据中包括了4个属性,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。通过这些数据,可以预测出鸢尾花卉属于三个品种中的哪一种。
# 数据准备
import seaborn as sns
iris = sns.load_dataset('iris')
# 用Seaborn画成对关系
sns.pairplot(iris)
plt.show()
⽤Seaborn中的pairplot函数来对数据集中的多个双变量的关系进行探索,如下图所示:
解析:
从图上可以看出,⼀共有 sepal_length、sepal_width、petal_length和petal_width4
个变量,它们分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。这张图相当于这4个变量两两之间的关系。
第一行第一列中的图代表的是花萼长度自身的分布图,右侧的第一行第二列的这张图代表的是花萼长度与花萼宽度这两个变量之间的关系。
1、Seaborn数据集中自带了car_crashes数据集,这是一个国外车祸的数据集,对这个数据集进行成对关系的探索。并用Seaborn画二元变量(x="total,y="speeding")分布图,如果想要画散点图,核密度图,Hexbin图该怎样写.
2、 探索更多seaborn-data 的数据展示
3、 你有应用的场景嘛?举个栗子