Python精美图快速上手

seaborn是一个基于Python的数据可视化库,它建立在Matplotlib之上,提供了一种更简单、更美观的方式来创建统计图形。seaborn旨在帮助用户轻松地生成有吸引力和信息丰富的可视化结果。

以下是seaborn库的一些主要特点:

  1. 美观的默认样式:seaborn通过提供现成的样式和颜色主题,使得创建各种类型的图形变得更加简单。它的默认样式经过精心设计,使得图表具有更高的可读性和美观度。

  2. 内置的统计图形:seaborn提供了一系列内置的统计图形,例如柱状图、箱型图、散点图、折线图等。这些图形不仅易于使用,还具有各种选项和参数,可以帮助你更好地展示和理解数据。

  3. 数据集可视化:seaborn还包含一些内置的示例数据集,这些数据集可以直接在库中使用。你可以使用这些数据集来快速生成演示图表,同时也可以将它们作为学习和实践的基础。

  4. 统计功能增强:seaborn提供了许多额外的统计功能,使得数据探索更加方便。例如,你可以使用seaborn轻松地绘制分布图、拟合回归线、绘制核密度图等。

  5. 多变量数据可视化:Seaborn提供了一些强大的工具来可视化多变量数据。你可以使用Seaborn绘制矩阵图、热力图、聚类图等,以揭示不同变量之间的关系和模式。

导入内置数据

In [1]:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

import seaborn as sns

导入seaborn内置的消费数据集:

In [2]:

tips = sns.load_dataset("tips")  # 需要网络环境
tips.head()

Out[2]:

导入iris数据集:

In [3]:

iris = sns.load_dataset("iris")  # 需要网络环境
iris

Out[3]:

下面的图形主要是基于两份数据进行绘制,包含的图形有:

  • 散点图sns.scatter

  • 回归散点图sns.lmplot

  • 分类散点图sns.stripplot

  • 分簇散点图sns.swarmplot

  • 柱状图sns.barplot

  • 计数柱状图sns.countplot

  • 直方图sns.histplot

  • 分布图sns.displot

  • 箱型图sns.boxplot

  • 小提琴图sns.violin

  • 热力图sns.heatmap

  • 聚类热图sns.clustermap

  • 分类图sns.catplot

  • 多图网格sns.FaceGrid

希望帮助读者快速上手seaborn绘图,文章有点长,欢迎点赞收藏。

散点图sns.scatterplot

基础散点图

In [4]:

sns.scatterplot(x="total_bill",y="tip",data=tips)

plt.title("basic scatter with seaborn")  # 添加标题

plt.show()

进阶散点图

指定散点的大小:

In [5]:

sns.scatterplot(x="total_bill",
                y="tip",
                size="size", # 指定散点大小
                data=tips)

plt.title("better scatter with seaborn")  # 添加标题

plt.show()

指定hue进行分组:

In [6]:

sns.scatterplot(x="total_bill",
                y="tip",
                hue="day", # 指定散点大小
                data=tips)

plt.title("better scatter with seaborn")  # 添加标题

plt.show()

回归散点图sns.lmplot

显示散点图中回归趋势线:使用lmplot方法

In [7]:

sns.lmplot(x="total_bill",
            y="tip",
            hue="time", # 分组
            data=tips)

plt.title("better scatter with seaborn")  # 添加标题

plt.show()

分类散点图sns.stripplot

默认情况

在默认情况下,只会对数据中数值型字段进行绘图:

In [8]:

sns.stripplot(data=tips)

plt.show()

通过参数orient设置水平或者垂直:

In [9]:

sns.stripplot(data=tips,orient="h")

plt.show()

基础分类散点图

指定x或者y

In [10]:

# 水平
sns.stripplot(data=tips, x="tip")

plt.show()

指定为y轴绘图:

In [11]:

# 垂直
sns.stripplot(data=tips, y="tip")

plt.show()

进阶分类散点图

水平方向:

In [12]:

sns.stripplot(data=tips, x="tip",y="day")

plt.show()

垂直方向:

In [13]:

sns.stripplot(data=tips, x="day", y="tip")

plt.show()

通过hue指定分组:

In [14]:

sns.stripplot(data=tips, x="day", y="tip", hue="smoker")

plt.show()

设置多个其他参数:

In [15]:

sns.stripplot(
    data=tips, # 指定数据、x、y轴
    x="total_bill", 
    y="day", 
    hue="time",  # 分组字段
    jitter=False,   # 抖动点
    s=20,  # 控制点的大小
    marker="D",  # D-方形  S-圆点
    linewidth=1,  # 线宽
    alpha=.3  # 透明度
)

plt.show()

分簇散点图sns.swarmplot

默认情况

在默认情况下,只会对数据中数值型字段进行绘图:

In [16]:

sns.swarmplot(data=tips)

plt.show()

通过orient指定水平方向:

In [17]:

sns.swarmplot(data=tips,orient='h')

plt.show()

基础分簇散点图

In [18]:

# 水平
sns.swarmplot(data=tips, x="total_bill")

plt.show()

指定在y轴上绘图:

In [19]:

# 水平
sns.swarmplot(data=tips, y="total_bill")

plt.show()

同时指定x和y

In [20]:

sns.swarmplot(data=tips,x="time", y="total_bill")

plt.show()

进阶分簇散点图

In [21]:

sns.swarmplot(data=tips,
              x="time", 
              y="total_bill",
              hue="day", # 指定分组字段
              marker="*",  # 设置marker  默认是圆点
              size=7,  # 设置marker大小
              linewidth=0.5  # 设置线宽
             )

plt.show()

柱状图sns.barplot

基础柱状图

如果只给定x和y,barplot方法实际上进行一个聚合汇总求均值的操作:

In [22]:

tips.groupby("day")["tip"].mean()

Out[22]:

day
Fri     2.734737
Sat     2.993103
Sun     3.255132
Thur    2.771452
Name: tip, dtype: float64

In [23]:

sns.barplot(data=tips,x="day",y="tip")

plt.show()

进阶柱状图

hue参数指定分组的字段:

In [24]:

sns.barplot(
    data=tips,
    x="day",
    y="tip",
    hue="smoker"  # 指定分组字段
    )

plt.show()

order参数指定x轴label的顺序:

In [25]:

sns.barplot(
    data=tips,
    x="day",
    y="tip",
    hue="smoker",  # 指定分组
    order=["Thur","Fri","Sat","Sun"] # 指定x轴label的顺序
    )

plt.show()

水平柱状图

orient参数指定水平h或者垂直v

In [26]:

sns.barplot(
    data=tips,
    x="tip",  # x轴的数据必须为数值
    y="day",
    hue="smoker",
    orient="h"
    )

plt.show()

计数柱状图sns.countplot

用于统计DataFrame中某个字段的不同取值数量。比如我们想统计sex中不同性别下的人数:

In [27]:

tips.groupby("sex").size()

Out[27]:

sex
Female     87
Male      157
dtype: int64

可以看到统计结果:Female是87人,Male是157人

In [28]:

# 写法1
# sns.countplot(tips["sex"])

# 写法2
sns.countplot(data=tips,x="sex")
plt.show()

也可以指定不同的分组:

In [29]:

sns.countplot(data=tips,
              x="sex",
              hue="day"  # 指定分组
             )

plt.show()

绘制水平柱状图:

In [30]:

sns.countplot(data=tips,
              y="sex",  # 将x改成y即可
              hue="day"  # 指定分组
             )

plt.show()

直方图sns.histplot

默认情况

如果不传入x和y,默认是对DataFrame中所有的数值字段进行操作:

In [31]:

sns.histplot(data=tips)

plt.show()

基础直方图

传入x或者y的情况:

In [32]:

sns.histplot(data=tips,x="tip")
# sns.histplot(x=tips["tip"])  等价

plt.show()

In [33]:

# fill表示是否填充柱子
sns.histplot(data=tips,x="tip",fill=False)  

plt.show()

改成水平方向柱状图:

In [34]:

sns.histplot(data=tips,y="tip")
# sns.histplot(y=tips["tip"])  等价

plt.show()

进阶直方图

binwidth控制每个柱子的宽度;bins控制柱子的个数

In [35]:

sns.histplot(data=tips,x="tip",binwidth=0.1,bins=50)

plt.show()

kde开启直方图与核密度图同时显示:

In [36]:

sns.histplot(data=tips,x="tip",kde=True)

plt.show()

In [37]:

sns.histplot(data=tips,x="tip",hue="day") # 指定分组情况

plt.show()

In [38]:

sns.histplot(data=tips,
             x="tip",
             hue="day",
             multiple="stack"  # 以堆叠的形式显示
            ) 

plt.show()

In [39]:

sns.histplot(data=tips,
             x="tip", 
             hue="day",# 分组
             stat="density", # 密度图(y轴刻度)
             element="step")  # bars  step  poly ;控制密度图显示方式,默认bars

plt.show()

In [40]:

sns.histplot(data=tips,
             x="tip", 
             hue="day",# 分组
             stat="density", # 密度图(y轴刻度)
             element="poly")  # bars step poly ;控制密度图显示方式

plt.show()

分布图sns.displot

基础分布图

默认情况下是统计DataFrame中某个属性中不同取值出现的次数:以柱状图的形式显示

In [41]:

tips.groupby("tip").size()

Out[41]:

tip
1.00     4
1.01     1
1.10     1
1.17     1
1.25     3
        ..
6.70     1
6.73     1
7.58     1
9.00     1
10.00    1
Length: 123, dtype: int64

In [42]:

sns.displot(data=tips,x="tip")
# sns.displot(data=tips["tip"])  等价

plt.show()

进阶分布图

In [43]:

sns.displot(data=tips,x="tip",hue="sex")  # 指定分组

plt.show()

使用kind参数,取值为:['hist', 'kde', 'ecdf']。hist就是上面默认的情况:

In [44]:

sns.displot(data=tips,x="tip",kind="kde")  
# sns.kdeplot(data=tips,x="tip")  等价于kdeplot

plt.show()

ecdf表示累计求和的效果:

In [45]:

# empirical cumulative distribution functions (ECDFs)

sns.displot(data=tips,x="tip",kind="ecdf")   

plt.show()

使用直方图结合核密度图:

In [46]:

sns.displot(data=tips,x="tip",kde=True)

plt.show()

箱型图sns.boxplot

基础箱型图

In [47]:

# sns.boxplot(tips["tip"])  # 等价1;默认是x=tips["tip"]
# sns.boxplot(data=tips, x="tip")  # 等价2
sns.boxplot(x=tips["tip"])
plt.show()

如果指定为y=tips["tip"],则变成垂直箱型图:

In [48]:

# sns.boxplot(data=tips, y="tip")  # 等价

sns.boxplot(y=tips["tip"])
plt.show()

同时指定x和y:

In [49]:

sns.boxplot(data=tips, x="day",y="tip")
plt.show()

交换x和y的位置变成水平箱型图:

In [50]:

sns.boxplot(data=tips, y="day",x="tip")
plt.show()

进阶箱型图

hue执行分组,此时x和y必须同时指定:

In [51]:

# hue执行分组

sns.boxplot(data=tips, x="day",y="tip",hue="sex")
plt.show()

dodge参数表示在执行hue分组的时候,不同组别下的数据是否放在一个主体中:

In [52]:

sns.boxplot(data=tips, x="day",y="tip",hue="sex",dodge=False)
plt.show()

设置多个绘图参数:

In [53]:

sns.boxplot(data=tips,
            x="day",
            y="tip",
            hue="sex",
            showcaps=False,  # 是否显示箱须(横线部分)
            notch=True  # 是否开启显示V型槽(箱体凹槽)
           )
plt.show()

小提琴图sns.violinplot

基础小提琴图

In [54]:

# sns.violinplot(tips["tip"])  # 默认是x=tips["tip"]
# sns.violinplot(x=tips["tip"])  

sns.violinplot(data=tips,x="tip")

plt.show()

垂直小提琴图:

In [55]:

# sns.violinplot(data=tips,y="tip")

sns.violinplot(y=tips["tip"])

plt.show()

进阶小提琴图

In [56]:

sns.violinplot(data=tips, x="sex",y="tip",hue="day")

plt.show()

交换x和y的位置,变成水平小提琴图:

In [57]:

# 交换x和y的位置

sns.violinplot(data=tips, y="sex",x="tip",hue="day")

plt.show()

设置其他参数:

In [58]:

sns.violinplot(data=tips, 
               y="sex",
               x="tip",
               hue="day",
               inner="stick"   # 控制内部虚线
              )

plt.show()

热力图sns.heatmap

基础热力图

指定条件下的透视表:

In [59]:

table = pd.pivot_table(tips,values="tip",columns=["day"],index=["sex"],aggfunc="mean")
table

Out[59]:

In [60]:

sns.heatmap(table)  # 默认

plt.show()

进阶热力图

In [61]:

# 显示文本信息及保留一位小数;设置线宽
sns.heatmap(table, # 数据
            annot=True,  # 显示文本
            fmt=".1f", # 保留一位小数
            linewidths=0.5,  # 设置线宽
            vmin=2,  # 颜色棒的最大值和最小值
            vmax=3.5,
            cbar=True,  # 是否显示右边的颜色棒
            cmap="crest"  # 色谱选择   cmap=sns.cubehelix_palette(as_cmap=True)
           )  

plt.show()

将x轴刻度显示在上面:

In [62]:

fig = sns.heatmap(table, annot=True,fmt=".1f")
fig.set(xlabel="",ylabel="")
fig.xaxis.tick_top()

聚类热图sns.clustermap

基础聚类热图

In [63]:

iris.dtypes

Out[63]:

sepal_length    float64
sepal_width     float64
petal_length    float64
petal_width     float64
species          object
species_id        int64
dtype: object

In [64]:

# 删除species字段,因为它的取值为字符串信息

iris_new = iris.drop("species",axis=1)
iris_new.head()

Out[64]:

默认情况下的聚类热力图:

In [65]:

sns.clustermap(iris_new)

plt.show()

进阶聚类热图

In [66]:

sns.clustermap(iris_new,
               figsize=(10,6),  # 大小
               cmap="mako",  # 色谱
               standard_scale=1,  # 是否数据缩放标准化(颜色棒取值为0到1)
               row_cluster=True,  # 是否row方向聚类效果(左侧)
              )

plt.show()

分类图sns.catplot

分类图方法sns.catplot主要是通过kind参数来指定生成不同的图形,其作用等效于对应的函数:

  • kind="box":boxplot

  • kind="violin":violinplot

  • kind="point":pointplot

  • kind="bar":barplot

  • kind="count":countplot

  • kind="strip":stripplot

  • kind="swarm":swarmplot

默认情况

在默认情况下,该函数将会生成散点图:

In [67]:

# 垂直方向

sns.catplot(data=tips,x="day",y="tip")
plt.show()

调换x和y的位置:

In [68]:

# 水平方向
sns.catplot(data=tips,y="day",x="tip")
plt.show()

kind参数

通过kind参数指定生成不同图形:

In [69]:

sns.catplot(data=tips,
            x="day",
            y="tip",
            kind="bar")
plt.show()

In [70]:

sns.catplot(data=tips,
            x="day",
            y="tip",
            kind="box")
plt.show()

In [71]:

sns.catplot(data=tips,
            x="day",
            y="tip", 
            kind="violin"
           )
plt.show()

In [72]:

sns.catplot(data=tips,
            x="day",
            y="tip",
            kind="swarm")
plt.show()

多图网格sns.FacetGrid

如何理解seaborn.FacetGrid函数?

(1)传入绘图数据

In [73]:

sns.FacetGrid(tips)

Out[73]:

(2)指定行、列元素

In [74]:

sns.FacetGrid(tips,col="day",row="sex")

Out[74]:

(3)调用map函数

In [75]:

f = sns.FacetGrid(tips,col="day",row="sex")

f.map(sns.scatterplot, "total_bill", "tip")

Out[75]:

In [76]:

f = sns.FacetGrid(tips,col="day",row="sex")

f.map(sns.violinplot, "total_bill")

In [77]:

f = sns.FacetGrid(tips,col="day",row="sex")
f.map(sns.histplot, "total_bill")

(4)调用map_dataframe函数

In [78]:

f = sns.FacetGrid(tips,col="sex",row="time")

f.map_dataframe(sns.barplot, y="total_bill")

Out[78]:

In [79]:

f = sns.FacetGrid(tips,col="day")

f.map_dataframe(sns.scatterplot, x="total_bill",y="tip")

Out[79]:

In [80]:

f = sns.FacetGrid(tips, col="time")

f.map_dataframe(sns.scatterplot, x="total_bill", y="tip", hue="sex")

f.add_legend()  # 添加图例(右侧)

Out[80]:

猜你喜欢

转载自blog.csdn.net/ytp552200ytp/article/details/131200903
今日推荐