最近在学习python,然后利用python自己也做了一些项目,但是在可视化这一步的时候总是容易卡住,就想着专门写一篇文章,也方便自己以后查看。
在开始之前,我想先聊一聊常见的图形,之前写过一篇常见的图形,这里我就自作主张把之前那篇文章放在这里了https://zhuanlan.zhihu.com/p/51935629
其实最常见的几种我基本都会在这篇文章力写出来,有兴趣的也可以自己去查阅官方文档,官方文档戳这里https://seaborn.pydata.org/tutorial.html,这个是纯英文的,我记得国内好像有大神组队翻译了这个库的基本操作,有兴趣的可以去github或者在知乎搜一下
我们今天就介绍一下常用的10种视图,即散点图,折线图,直方图,条形图,箱线图,饼图,热力图,蜘蛛图,二元变量分布和成对关系
好的话不多说,让我们开始吧!
因为python提供了很多可视化的库,比如matplotlib,seaborn、Plotly,Pyecharts,Mapbox,Geoplotlib等,其中使用频率最高的是Matplotlib和Seaborn,所以这篇文章我就以Matplotlib和Seaborn这两个库为例来进行一些基本的操作了
#首先先导入几个可能用到的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
下一步看一下接下来能够用到的几个函数的基本语法
seaborn.relplot(x=None, y=None, hue=None, size=None,
style=None, data=None, row=None, col=None, col_wrap=None,
row_order=None, col_order=None, palette=None, hue_order=None,
hue_norm=None, sizes=None, size_order=None, size_norm=None,
markers=None, dashes=None, style_order=None, legend='brief',
kind='scatter', height=5, aspect=1, facet_kws=None, **kwargs)¶
就以relplot这个函数来说,可以看到有很多参数,所以理论上来讲可以通过加入不同的参数然后改变图形的样子,得到不同的图形,这里我们以比较常见的几个来举几个例子,
x和y这个就是我们通常意义上的x和y即自变量和因变量。
hue表示的是色彩,可以理解为不同的值最终展现出来的颜色是不一样的
size 表示大小,把元素按照不同的大小来显示
style表示按照不同的风格来显示,比如加号和×等
data这个是要加载对应的数据,这个是必要的
其他的还有很多参数,就不一以介绍了,现在就按照刚刚提到的几个参数来看一下具体的图形是什么样的
这里我们就以seaborn自带的tips这个数据集为例
import seaborn as sns
sns.set(style='ticks')
tips = sns.load_dataset('tips')
g = sns.relplot(x='total_bill',y='tip',data=tips)
首先是不考虑hue这个参数的
是不是感觉杂乱无章,因为小数点全都堆叠在了一起
那么现在考虑加入hue这个参数
sns.set(style='ticks')
tips = sns.load_dataset('tips')
g = sns.relplot(x='total_bill',y='tip',hue='day',data=tips)
图形如下
这样是不是就比第一个图形好多了?hue在这里就是起到了按照day的不同,显示不同颜色的作用
那么我们在在此基础上加上一个size这个参数,看看有什么效果
sns.set(style='ticks')
tips = sns.load_dataset('tips')
g = sns.relplot(x='total_bill',y='tip',hue='day',size='size',data=tips)
这个图相比于上面的图,就更加好读一点了,当然,size这里也可以是自定义的大小
下面我们看一下style参数的使用
sns.set(style='ticks')
tips = sns.load_dataset('tips')
g = sns.relplot(x='total_bill',y='tip',hue='day',size='day',style='day',data=tips)
图形如下
能够看到圆点变成了多个风格,当然这个图形已经很难读出比较有效的东西了,所以对于可视化来说,不建议使用太多参数,一个好的图形应该是一目了然的,而不是花里胡哨
我们在来看一看matplotlib的基本操作
同样找到官方文档https://matplotlib.org/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py
由于matplotlib这个库包含大量的参数,我就不展开了
我们需要知道有以下常用的功能
plt.figure()这个是当创建的时候图形是在图中的时候使用的
颜色,标记和线的类型
使用例如
a.plot(x,y,linestyle='--',color='g')的方式来定义
而对于绘图范围,刻度位置以及刻度标签,则可以使用xlim,ylim,xticks,yticks,xticktable,yticktable等
学习了上面的操作以后,我们开始绘制常见的可视化图形
散点图
散点图在英文中被称为scatter plot,讲两个变量值放在二维坐标中,能够很好的展现出两个变量之间的关系
#准备数据
N = 100
x = np.random.randn(N)
y = np.random.randn(N)
#用Matplotlib绘制散点图
plt.scatter(x,y,marker='x')
plt.show()
图形如下
使用seaborn绘图
df = pd.DataFrame({'x':x,'y':y})
sns.relplot(x='x',y='y',data=df,kind='scatter')
plt.show()
图形如下
折线图
折线图可以用来表示数据随着时间变化的趋势
在Matplotlib中,我们可以使用plt.plot()函数,当然在绘图之前,我们要先把数据按照x轴的大小进行排序,要不画出来的折线图无法按照x轴递增的顺序显示
而在seaborn中,我们可以直接使用sns.lineplot(x,y,data=None)函数
x = [2001,2002,2003,2004,2005,2006,2007,2008,2009,2010]
y = [2,4,11,54,62,23,72,61,34,28]
#使用Matplotlib绘制折线图
plt.plot(x,y)
plt.show()
图形如下
df = pd.DataFrame({'x':x,'y':y})
sns.lineplot(x='x',y='y',data=df)
plt.show()
使用seaborn绘制,图形如下
直方图
直方图是我们比较常见的图,把坐标轴为一定数量的小区间,这些小区间内用矩形条展示该区间的值
在Matplotlib中,我们使用plt.hist(x,bins=10)函数,其中x代表的是一维数组
bins是直方图中区间数量,默认是10
在seaborn中,我们使用sns.distplot(x,bins=10,kde=True)函数,x和bins的含义Matplotlib的含义基本一致,而kde代表的是核密度估计,默认为True,我们也可以通过设置为False的方法,核密度估计是通过核函数来帮我们估计概率密度的方法
#准备数据
a = np.random.randn(100)
s = pd.Series(a)
#用Matplotlib绘制直方图
plt.hist(s)
plt.show()
#用Seaborn绘制直方图
#kde设置为False
sns.distplot(s,kde=False)
plt.show()
#kde设置为True
sns.distplot(s,kde=True)
plt.show()
三幅图分别如下
可以看到前面两幅图没有区别,而最后一幅图是kde默认为True的情形,这个图加了一条集中趋势线
条形图
直方图表示变量数值分布,而条形图能够帮助我们查看类别的特征,在条形图中,长条形的长度表示的是频数,宽度表示类别
在Matplotlib中,使用plt.bar(x,height)函数,其中x代表x轴的位置序列,heighti表示的是y轴的数值,也即柱子的高度
在seaborn中,我们可以使用sns.barplot(x=None,y=None,data=None)函数
#准备数据
x = ['col1','col2','col3','col4','col5']
y = [6,4,7,11,9]
#用Matplotlib绘制条形图
plt.bar(x,y)
plt.show()
#用seaborn绘制条形图
sns.barplot(x,y)
plt.show()
图形结果如下
可以看到seaborn自动的给不同类别的条形图加了颜色,看起来就比较方便了
箱线图
箱线图常常和分位数结合在一起,可以根据箱线图的图形判断数据的差异性,离散程度,以及异常值
在Matplotlib中,使用plt.boxplot(x.labels=None)函数,x代表要绘制的箱线图数据,labels代表缺省值,可以为箱线图加上标签
在seaborn'中,使用sns.boxplot(x=None,y=None,data=None)函数
# 准备数据
# 0-1 之间的 生成10*4 维度数据
data=np.random.normal(size=(10,4))
lables = ['A','B','C','D']
# 用 Matplotlib 绘制箱线图
plt.boxplot(data,labels=lables)
plt.show()
# 用 Seaborn 绘制箱线图
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()
图形如下
饼图
饼图是我们常见的一种图,能够显示每个模块的占比,但是如果占比相差不大时可能会不明显
这里就直接使用Matplotlib,plt.pie(x,labels=None)
#准备数据
nums = [20, 36, 40, 37, 6]
labels = ['High-school','Bachelor','Master','Ph.d', 'Others']
# 用 Matplotlib 绘制饼图
plt.pie(x = nums, labels=labels)
plt.show()
图形如下
热力图,
热力图英文名叫heat map,是矩阵的一种表示方法,矩阵的元素值用不同的颜色来带代表,不同颜色代表大小不同的值,通过颜色的深浅可以直观了解每个位置数值的大小,这里推荐seaborn官方文档https://seaborn.pydata.org/generated/seaborn.heatmap.html#seaborn.heatmap,这里面有详细的不同参数的操作,很有意思,感兴趣的可以看一下
我们此处就直接使用seaborn中的sns.heatmap(data)函数,采用seaborn中自带的数据集flights,该数据集记录了1949-1960年间每个航班乘客的数量
flights = sns.load_dataset('flights')
flights = flights.pivot('month','year','passengers')
ax = sns.heatmap(flights,annot=True,fmt='d')
这里我使用直接显示数值的方式
看图
写道这里已经十二点钟了,考虑到明天还要早起上班,就先写到这里,剩下的明天在做吧,明天将会把剩余的几个图形显示出来,并且详细说一下各个参数代表的含义。。。。
未完待续。。。。Loading.......