最近在学习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, stylex=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(stylex=ticks) tips = sns.load_dataset(tips) g = sns.relplot(x=total_bill,y=tip,data=tips)
首先是不考虑hue这个参数的
是不是感觉杂乱无章,因为小数点全都堆叠在了一起
那么现在考虑加入hue这个参数
sns.set(stylex=ticks) tips = sns.load_dataset(tips) g = sns.relplot(x=total_bill,y=tip,hue=day,data=tips)
图形如下
这样是不是就比第一个图形好多了?hue在这里就是起到了按照day的不同,显示不同颜色的作用
那么我们在在此基础上加上一个size这个参数,看看有什么效果
sns.set(stylex=ticks) tips = sns.load_dataset(tips) g = sns.relplot(x=total_bill,y=tip,hue=day,size=size,data=tips)
这个图相比于上面的图,就更加好读一点了,当然,size这里也可以是自定义的大小
下面我们看一下style参数的使用
sns.set(stylex=ticks) tips = sns.load_dataset(tips) g = sns.relplot(x=total_bill,y=tip,hue=day,size=day,stylex=day,data=tips)
能够看到圆点变成了多个风格,当然这个图形已经很难读出比较有效的东西了,所以对于可视化来说,不建议使用太多参数,一个好的图形应该是一目了然的,而不是花里胡哨
我们在来看一看matplotlib的基本操作
同样找到官方文档https://matplotlib.org/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py
由于matplotlib这个库包含大量的参数,我就不展开了
我们需要知道有以下常用的功能
plt.figure()这个是当创建的时候图形是在图中的时候使用的
颜色,标记和线的类型
使用例如
a.plot(x,y,linestylex=--,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.......