前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >☀️苏州程序大白一文从基础手把手教你Python数据可视化大佬☀️《❤️记得收藏❤️》

☀️苏州程序大白一文从基础手把手教你Python数据可视化大佬☀️《❤️记得收藏❤️》

作者头像
苏州程序大白
发布2021-10-12 16:06:32
9260
发布2021-10-12 16:06:32
举报

目录

🏳️‍🌈开讲啦!!!!🏳️‍🌈苏州程序大白🏳️‍🌈

🌟博主介绍

💂 个人主页:苏州程序大白undefined 🤟作者介绍:中国DBA联盟(ACDU)成员,CSDN全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室。undefined 💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦undefined 🎗️ 承接各种软件开发项目undefined 💅 有任何问题欢迎私信,看到会及时回复undefined 👤 微信号:stbsl6,微信公众号:苏州程序大白undefined 🎯 想加入技术交流群的可以加我好友,群里会分享学习资料undefined

前言

环境搭建:

下载Anaconda搭建Python环境。细讲可以看文章

下载类库NumpySciPymatplotlibpandasseaborn。可以参考本文

引入需要的库,设置一下显示网格的样式:

代码语言:javascript
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

数据关系可视化

下面我们使用seaborn最常用的方法relplot()实现散点图**scatterplot()**和线图**lineplot()**。

散点图 Scatter plots

首先可以引入seaborn中自带事例子数据集“tips”,这个数据集的属性有:

  • 时间数据 week。
  • 账单: 总消费,小费 total_bill, tips。
  • 消费者性别 sex。
  • 消费者是否抽烟 smoker。
  • 等等…

下面很多例子使用了tips数据集,不会再特别指出

代码语言:javascript
复制
sns.set(style="darkgrid") # 设置样式为网格
tips = sns.load_dataset("tips")

其实seaborn中有很多画散点图的方法其中一种是scatterplot(),使用方法是把数据集中的集合分配给方法中的属性,这样不同集合就会使用散点图中不同属性的样式展示出来如下面实例中的色调属性hue获取了数据集中的smoker集合,这样集合中的数据差异就可以通过色调的不同展示出来,其他同理。

代码语言:javascript
复制
sns.relplot(x="total_bill", y="tip", size="size",hue="smoker", palette="ch:r=-.5,l=.75",  style="time",sizes=(15, 200), data=tips);

scatterplotrelplot的默认方法所以不需要单独设置,具体属性可以去scatterplot()的Api查看。

折线图强调连续性 Emphasizing continuity with line plots

relplot里的第二个方法lineplot,前面说过默认方法是scatterplot所以要设置属性kind=lineplot启用折线图,这个方法默认sort=true将x轴数据与y轴数据按顺序对应起来。

代码语言:javascript
复制
fmri = sns.load_dataset("fmri")
sns.relplot(x="timepoint", 
            y="signal",
            hue="region", 
            style="event",
            dashes=True, # 开启显示虚线
            markers=True, # 显示标记
          	# ci="sd" # 显示标准偏差,默认是显示置信区间,None关闭显示
            kind="line", 
            data=fmri);

这里我们引入一个新的fmri数据集。

同时显示多了图表

用到relplot的属性是colcol_wrap自动分行,同理也可以用row属性设置列。

代码语言:javascript
复制
sns.relplot(x="timepoint", y="signal", hue="event", style="event",
            col="subject", 
            col_wrap=5, # 设置每行显示图表数量
            height=3, # 每个图表的高度 
            kind="line",
            data=fmri.query("region == 'frontal'"));

数据种类的可视化 Plotting with categorical data

对数据进行分类可视化用到的方法是catplot(),和数据关系可视化类似,catplot()也有多种分类(kind),包括散点图(strip,swarm),分布图(box,violin,boxen)和柱状图(point,bar,count)。

代码语言:javascript
复制
sns.set(style="ticks", color_codes=True) #设置一下样式

散点图 categories scatterplots

除了种类外,散点图能精确的显示数据的分布,散点图默认显示方式是stript,例如下面的例子。

代码语言:javascript
复制
tips = sns.load_dataset("tips") #载入数据
sns.catplot(x="day", y="total_bill", data=tips); 

可以发现上面有些数据重叠在一起了,解决这个问题可以使用jitter属性,也可使用另一种散点图swarm,它自动使用算法区分出可能重叠的数据。需要注意的是可以使用order来控制顺序。下面的例子可以看出:

代码语言:javascript
复制
sns.catplot(x="total_bill", y="day", hue="time", kind="swarm",  order=["Sun", "Sat","Fri","Thur"], data=tips);

分布图 Distributions of observations within categories

数据量太大的时候,散点图显示不同种类的分布情况非常恐怖,所以可以使用分布图来观察不同种类数据的分布情况,具体代码就不贴了,只需要更改一下kind属性就可以了,下面分别看一下box,boxen,violin三种情况不同的显示风格:

其中要重点说一下violin方法使用了KDE,因此有一些额外的属性可以设置,具体可以查看一下api例如:

代码语言:javascript
复制
sns.catplot(x="total_bill", y="day", hue="sex",bw=.4, cut=2, inner="stick",
            kind="violin", split=True, data=tips);

合并图表

另外看一下如何将两个不同类型的图表合为一个,例如下面我们将violinswarm类型的图表在一张图里展示:

代码语言:javascript
复制
g = sns.catplot(x="day", y="total_bill", kind="violin", inner=None, data=tips)
sns.swarmplot(x="day", y="total_bill", color="k", size=3, data=tips, ax=g.ax);

数据估计

很多情况我们是不需要特别精确的数据信息的,只需要了解各个分类的走势和差异性,这个时候柱状图bar和点状图point可以展示的信息更简洁明了。

例如这里我们引入一个新的数据集titanic来分析一下泰坦尼克号上不同仓位的乘客的生存率

代码语言:javascript
复制
titanic = sns.load_dataset("titanic")

首先下面看一下柱状图,这张图是可以直观的比较出各个仓位的生存率,需要指出的是柱状图的矩形边框也可以设置颜色。

代码语言:javascript
复制
sns.catplot(x="class", 
            y="survived", hue="sex",
            palette={"male": "g", "female": "m"}, # 设置hue属性显示的颜色
            edgecolor=".6",
            kind="bar", 
            data=titanic);

点状图可以设置的属性也有很多,比如线的样式,点的样式等等

代码语言:javascript
复制
sns.catplot(x="class", y="survived", hue="sex",
            palette={"male": "g", "female": "m"},
            markers=["^", "o"], linestyles=["-", "--"],
            kind="point", data=titanic);

图表的大小控制

设置图表的大小可以使用matplotlib里的plt.subplots(figsize=(width,height))

想要改变图表各个轴的精度可以使用set方法参照下面的实例

代码语言:javascript
复制
g = sns.catplot(x="fare", y="survived", row="class",
                kind="box", orient="h", height=1.5, aspect=4,
                data=titanic.query("fare > 0"))
g.set(xscale="log"); # x轴以对数形式显示

数据分布的可视化 Visualizing the distribution of a dataset

拿到数据集后,通常第一件事就是确定数据的分布,接下来我们看一下对于单变量(unvariable)和双变量(bivariable)分布如何进行可视化。

绘制单变量分布图 Ploting univariate distributions

单变量分布的常见可视化模式是直方图(histogram)或者KDA(kernel debsity estimate),在seaborn中使用的方法是displot(),其中的hist属性控制是否显示直方图(默认开启),kda属性控制是否显示KDA分布(默认开启),rug属性控制显示刻度(默认关闭)。

代码语言:javascript
复制
x = np.random.normal(size=100)
sns.distplot(x,hist=True,kde=True, rug=True);

直方图没什么说的,是观察数据分布常见且直观的一个方法,原理也比较简单. 这里重点说一下KDE,它本身在很多领域都是极其重要的工具. 绘制kde图还可以使用kdeplot()方法或者rugplot()方法,例如下面的例子

代码语言:javascript
复制
x = np.random.normal(0, 1, size=30)
sns.kdeplot(x)
sns.kdeplot(x, shade=True, bw=.2,  label="bw: .2"); # shade属性控制是否显示分布区域阴影
sns.kdeplot(x, bw=2, label="bw: 2") 
plt.legend();

从图中可以看出,bw属性控制的是kde曲线的拟合程度。

绘制双变量分布图 Ploting bivariate distributions

首先我们创建一个数据集作为例子

代码语言:javascript
复制
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])

绘制双变量分布图的方法是jointplot(),用多个面板从两个维度绘制数据分布,seaborn提供了scatterplot(defult),hexbin,kde三种样式

代码语言:javascript
复制
sns.jointplot(x="x", y="y", data=df);
代码语言:javascript
复制
x, y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
    sns.jointplot(x=x, y=y, kind="hex", color="k");
代码语言:javascript
复制
sns.jointplot(x="x", y="y", data=df, kind="kde");

其实kdeplot()也可以实现kde双变量分布

代码语言:javascript
复制
f, ax = plt.subplots(figsize=(6, 6)) # 设置显示图形的大小
sns.kdeplot(df.x, df.y, ax=ax)	
sns.rugplot(df.x, color="g", ax=ax)
sns.rugplot(df.y, vertical=True, ax=ax);

可视化数据集中的成对关系 Visualizing pairwise relationships in a dataset

例如调用数据集iris(鸢尾属植物)

代码语言:javascript
复制
iris = sns.load_dataset("iris")

然后使用pairplot()方法

代码语言:javascript
复制
sns.pairplot(iris, hue="species");

四个属性sepal_width sepa_height和petal_length petal_width的对应关系。

线性关系的可视化 Visualizing linear relationships

线性回归模型在数据可视化中可以展示数据的分布和趋势,也可以起到预测数据的作用。我们还是使用小费tips数据集。

代码语言:javascript
复制
tips = sns.load_dataset("tips")

画线性回归模型的方法 Functions to draw linear regression models

seaborn提供了两个方法regplot()lmplot()

代码语言:javascript
复制
sns.regplot(x="total_bill", y="tip", data=tips);
代码语言:javascript
复制
sns.lmplot(x="total_bill", y="tip", data=tips);

通过上面两个例子 ,会发现这两个方法绘制的结果区别不大,但是他们传入的数据是有区别的:

  • regplot()xy轴可以是简单的numpy数组,pandas series对象或者pandas DataFrame对象
  • lmplot()的x,y参数必须指定为字符串。

拟合不同种类的数据 Fitting different kinds of models

代码语言:javascript
复制
anscombe = sns.load_dataset("anscombe")

以数据集Anscombe’s quartet(安斯库姆四重奏)为例,先通过下面的表格简单了解一下这个数据集,简单是说就是四组包含<x,y>的数据集:

然后plot一下四组数据(注意这里使用lmplot,所以x,y轴对应的是字符串),基本工作流程是使用数据集和用于构造网格的变量初始化FacetGrid对象。

代码语言:javascript
复制
sns.lmplot(x="x", y="y", col="dataset", col_wrap=2, data=anscombe,
           ci=None,scatter_kws={"s": 80});

现在分析一下这四个数据集,第一个没啥显著特征,观察第二个数据集可以发现它存在高阶关系,可以通过order属性控制阶数,进行多项式回归拟合

代码语言:javascript
复制
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
           order=2, ci=None, scatter_kws={"s": 80});

第三个数据集存在一个噪点outlier影响了拟合效果,可以使用roboust属性保持健壮性

代码语言:javascript
复制
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
           robust=True, ci=None, scatter_kws={"s": 80});
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 🏳️‍🌈开讲啦!!!!🏳️‍🌈苏州程序大白🏳️‍🌈
  • 🌟博主介绍
  • 前言
  • 数据关系可视化
    • 散点图 Scatter plots
      • 折线图强调连续性 Emphasizing continuity with line plots
        • 同时显示多了图表
        • 数据种类的可视化 Plotting with categorical data
          • 散点图 categories scatterplots
          • 分布图 Distributions of observations within categories
            • 合并图表
              • 数据估计
                • 图表的大小控制
                • 数据分布的可视化 Visualizing the distribution of a dataset
                  • 绘制单变量分布图 Ploting univariate distributions
                    • 绘制双变量分布图 Ploting bivariate distributions
                      • 可视化数据集中的成对关系 Visualizing pairwise relationships in a dataset
                        • 线性关系的可视化 Visualizing linear relationships
                          • 画线性回归模型的方法 Functions to draw linear regression models
                          • 拟合不同种类的数据 Fitting different kinds of models
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档