最近在学习python,然后利用python自己也做了一些项目,但是在可视化这一步的时候总是容易卡住,就想著专门写一篇文章,也方便自己以后查看。

在开始之前,我想先聊一聊常见的图形,之前写过一篇常见的图形,这里我就自作主张把之前那篇文章放在这里了zhuanlan.zhihu.com/p/51

其实最常见的几种我基本都会在这篇文章力写出来,有兴趣的也可以自己去查阅官方文档,官方文档戳这里seaborn.pydata.org/tuto,这个是纯英文的,我记得国内好像有大神组队翻译了这个库的基本操作,有兴趣的可以去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的基本操作

同样找到官方文档matplotlib.org/tutorial

由于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官方文档seaborn.pydata.org/gene,这里面有详细的不同参数的操作,很有意思,感兴趣的可以看一下

我们此处就直接使用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.......


推荐阅读:
相关文章