Matplotlib进阶:Seaborn教程

Matplotlib进阶:Seaborn教程

martin

样式管理

为了能进行后续工作,要进行如下操作:

>>>import numpy as np
>>>import matplotlib as mpl
>>>import matplotlib.pyplot as plt
>>>import seaborn as sns
>>> def sinplot(flip=1):
...     x = np.linspace(0, 14, 100)
...     for i in range(1, 7):
...         plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

使用axes_style()和set_style()控制外观

有五个预设的seaborn主题:暗网格(darkgrid),白网格(whitegrid),全黑(dark),全白(white),全刻度(ticks)。用来适合不同的应用和个人喜好:

>>> sinplot()
>>> plt.show()
   
   
  • 1
  • 2

1.png-68.4kB

>>> sns.set_style("dark")   # 改变主题
>>> sinplot()
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-66.8kB

>>> sns.set_style("white")
>>> sinplot()
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-68.6kB

>>> sns.set_style("ticks")
>>> sinplot()
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-69.5kB

虽然很容易来回切换,但也可以在with语句中使用axes_style()函数临时设置绘图参数。这样可以采用不同样式的轴制作图形:

>>> with sns.axes_style("darkgrid"):
...     plt.subplot(211)
...     sinplot()
... 
>>> plt.subplot(212)
>>> sinplot(-1)
>>> plt.show()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.png-98.6kB

选择颜色(可选)

见官方文档

绘图函数

可视化数据的分布

当处理一组数据时,通常首先要做的是了解变量是如何分布的。这一节将介绍Seaborn中一些用于展现单变量和双变量分布的绘图工具函数。
在进行绘图之前需要引入的包和相应操作:

>>>import numpy as np
>>>import pandas as pd
>>>from scipy import stats, integrate   # 该包包含是常用的数学函数
>>>import matplotlib.pyplot as plt
>>>import seaborn as sns                # 一般规定将seaborn简写为sns
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
绘制单变量分布

在seaborn中想要对单变量分布进行快速了解最方便的就是使用distplot()函数,默认情况下它将绘制一个直方图,并且可以同时画出核密度估计(KDE)。

>>>x = np.random.normal(size=100)   # 正态分布
>>>sns.distplot(x)
>>>plt.show()
   
   
  • 1
  • 2
  • 3

1.png-18.8kB

  • 直方图
    直方图可能是最显而易懂的,直方图在matplotlib中也有。在seborn中,直方图根据x轴的数据范围会生成各个数据段(bins),在每个数据段中会放入相应的数据而直方图的高度就是落入该数据段的数据的多少。为了说明,我们把密度曲线去掉,相应的我们在图上加上表达数据量多少的小刻度。控制密度曲线的有无通过参数kde来控制,控制数据量刻度的有无使用参数rug:
>>> x = np.random.normal(size=100)
>>> sns.distplot(x,kde=False,rug=True)
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-6.4kB
在绘制直方图时,如果想要指定数据段的多少可以通过参数bins来控制:

>>> x = np.random.normal(size=100)
>>> sns.distplot(x,bins=20,kde=False,rug=True)
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-7.4kB

  • 核密度估计
    想要绘制核密度函数只需把直方图抹掉即可,通过参数hist来控制:
>>> x = np.random.normal(size=100)
>>> sns.distplot(x,hist=False,rug=True)
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-17.9kB
如果我们在seaborn中使用kdeplot()函数,我们得到相同的曲线。此函数内部调用了distplot(),但它提供了一个更直接的界面,当只需要密度估计时,更容易访问其他选项,例如将区域阴影化:

>>> x = np.random.normal(size=100)
>>> sns.kdeplot(x,shade=True)
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-17.9kB

KDE的带宽(bw)参数控制估计与数据的拟合程度,非常类似于直方图中的bin大小。它对应于我们在上面绘制的内核的宽度:

>>> x = np.random.normal(0,1,size=30)
>>> sns.kdeplot(x)
>>> sns.kdeplot(x,bw=.2,label='bw:0.2')
>>> sns.kdeplot(x,bw=2,label='bw:2')
>>> plt.show()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

1.png-27.5kB

  • 拟合参数分布

还可以使用distplot()将参数分布拟合到数据集,并直观地评估它与观察数据的对应程度:

>>> x = np.random.gamma(6,size=200)
>>> sns.distplot(x,kde=False,fit=stats.gamma)
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-15.3kB

绘制二元分布

seaborn可以可视化两个变量的双变量分布。在seaborn中做最简单的方法是使用jointplot()函数,它创建一个多面板图,显示两个变量之间的双变量(或联合)关系以及每个变量的单变量(或边际)分布轴。

>>> mean,cov = [0,1],[(1,.5),(.5,1)]
>>> data = np.random.multivariate_normal(mean,cov,200)
>>> df = pd.DataFrame(data,columns=['x','y'])
   
   
  • 1
  • 2
  • 3
  • 散点图

使二元分布可视化的最熟悉的方法是散点图,其中每个观测值以点和x和y值显示。这是在两个维度上的地毯图:

>>> sns.jointplot(x='x',y='y',data=df)
>>> plt.show()
   
   
  • 1
  • 2

1.png-17.7kB

  • Hexbin图
    直方图的双变量模拟称为“六边形”图,它显示了落入六边形框内的观察值的计数:
>>> x,y = np.random.multivariate_normal(mean,cov,1000).T
>>> sns.jointplot(x=x,y=y,kind='hex')
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-48.8kB

  • 核密度估计
    也可以使用上述核密度估计过程来可视化双变量分布。在seaborn中,这种情节以等高线图显示,并且在jointplot()中作为样式提供:
>>> sns.jointplot(x="x", y="y", data=df, kind="kde")
>>> plt.show()
   
   
  • 1
  • 2

1.png-20.1kB

还可以使用kdeplot()函数绘制二维核密度图:

>>> 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) # vertical控制y列数据是否垂直放置
>>> plt.show()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

1.png-60.7kB

如果希望更连续地显示双变量密度,可以简单地增加轮廓线的数量:

>>> f,ax = plt.subplots(figsize=(6,6))
>>> cmap =sns.cubehelix_palette(as_cmap=True,dark=0,light=1,reverse=True)
>>> sns.kdeplot(df.x,df.y,cmap=cmap,n_levels=60,shade=True)
>>> plt.show()
   
   
  • 1
  • 2
  • 3
  • 4

1.png-21.5kB

jointplot()函数使用JointGrid来管理图形。为了令使用达到最大的灵活性,可以直接使用JointGrid来绘制图形。 jointplot()在绘制后返回JointGrid对象,可以使用它添加更多图层或调整可视化的其他方面:

>>> g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")
>>> g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
>>> g.ax_joint.collections[0].set_alpha(0)
>>> g.set_axis_labels("$X$", "$Y$") # 可以使用markdown语法
>>> plt.show()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

1.png-30.5kB

  • 可视化数据集中成对的关系

要在数据集中绘制多个成对的双变量分布,可以使用pairplot()函数。它将创建一个轴矩阵,并显示DataFrame中每对列的关系。默认情况下,绘制每个变量在对角线上的单变量分布Axes:

>>> iris = sns.load_dataset("iris") 
# iris是一个花种类的数据集,seaborn自带,scikit-learn也均包含
>>> sns.pairplot(iris)
>>> plt.show()
   
   
  • 1
  • 2
  • 3
  • 4

iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。可通过iris.head()或者iris.info()来预览查看数据集。
1.png-81.6kB

与jointplot()和JointGrid之间的关系非常类似,pairplot()函数构建在PairGrid对象的顶部,可以直接使用来使得作图更具灵活性:

>>>g = sns.PairGrid(iris)
>>>g.map_diag(sns.kdeplot)
>>>g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6)
   
   
  • 1
  • 2
  • 3

1.png-189.8kB

可视化线性回归关系模型(可选)

许多数据集包含多个定量变量,分析的目标通常是将这些变量相互关联。我们先前讨论了可以通过显示两个变量的联合分布来实现这一点的函数。然而,使用统计模型来估计两组噪声集合之间的简单关系可能更具意义。本节将介绍如何通过线性回归框架来完成这些工作。seaborn的回归图表主要是为了在视觉上对数据有个客观的认知和指引,有助于在数据分析期间强调数据集中的模式和关系。也就是说,seaborn本身不是用于统计分析的包,如果要获得与回归模型拟合相关的定量度量,应该使用statsmodels。然而,seaborn的目的是通过可视化数据集来快速、简单地探索数据,相比通过统计表探索数据集,这种可视化手段或许会更有帮助和重要。

使用分类数据绘图

利用不同类型模型来拟合数据

我们之前介绍了怎样使用散点图和回归图来拟合数据并可视化两个变量之间的关系同时展现它们是 如何在某一特定类别上是进行变化的。然而,如果某一主要变量是分类的我们该怎么办?在这种情况下散点图和回归图就起不了作用了。解决的办法有很多,所以,为了能绘制这种关系我们这节将会讨论到这些方法。
可以将seaborn的分类图分为三组:1、分类变量在每个类别上显示的观测值,2、抽象出每个观测值的分布3、应用统计估计值显示中心趋势测量值的观测值和置信区间。第一组包括函数swarmplot()和stripplot(),第二组包括boxplot()和violinplot(),第三组包括barplot()和pointplot()。尽管这些函数都有其特定的参数用于控制该数据的可视化的详细信息,但这些函数都共用一套基础API来规范如何接收数据。为了能进行后续的讲解,要进行如下操作:

>>> titanic = sns.load_dataset('titanic')
>>> tips = sns.load_dataset('tips')
>>> iris = sns.load_dataset('iris')
   
   
  • 1
  • 2
  • 3

titanic:泰坦尼克遇难人员数据,可通过titanic.head()或者titanic.info()来预览查看数据集。

分类散点图

使用stripplot()可以非常简单的将某种分类别的数据展现在散点图上:

>>> sns.stripplot(x='day',y='total_bill',data=tips)
>>> plt.show()
   
   
  • 1
  • 2

1.png-14.2kB

在带状图中,散点图通常会重叠,使得很难看到数据的完全分布。解决方案是使用一些随机的“抖动”来调整位置(仅沿着分类轴):

>>> sns.stripplot(x='day',y='total_bill',data=tips,jitter=True)
>>> plt.show()
   
   
  • 1
  • 2

1.png-24.5kB

也可以换种思路,使用函数swarmplot(),它使用避免重叠点的算法定位分类轴上的每个散点图点:

>>> sns.swarmplot(x='day',y='total_bill',data=tips)
>>> plt.show()
   
   
  • 1
  • 2

1.png-26.6kB

更方便的是可以使用hue参数添加嵌套的分类变量:

>>> sns.swarmplot(x='day',y='total_bill',data=tips,hue='sex')
>>> plt.show()
   
   
  • 1
  • 2

1.png-28.5kB

通常,seaborn的分类别绘图函数会推断出数据里面的类别顺序,如果数据是pandas类型那么会默认按着pandas的既定顺序给出,如果是其他数据类型,比如string类型,那么将会按着在DataFram的出现顺序给出,但是如果类别是数字类型的将会自动排序:

>>> sns.swarmplot(x="size", y="total_bill", data=tips)
>>> plt.show()
   
   
  • 1
  • 2

1.png-25.6kB

如果想要将垂直的散点图横向过来放置在y轴上可以使用orient关键字强制定向,但通常可以颠倒x和y的顺序来改变绘图方向:

>>> sns.swarmplot(x="total_bill", y="day", hue="time", data=tips)
>>> plt.show()
   
   
  • 1
  • 2

1.png-26.5kB

观测值分布

在某种程度上,分类散点图在处理每个类别中的值的分布方面变得有限。seaborn中有几种方法可以方便地汇总这些信息,以便于在类别级别之间轻松的进行比较。这一节我们将要讨论在多个分布之间进行快速比价的方法:

  • 箱型图
    绘制箱型图的函数是boxplot()。这种图表显示了分布的三个四分位数值以及极值。“晶须”延伸到位于下四分位数和上四分位数的1.5IQR内的点,然后落在该范围之外的数据独立显示。重要的是,箱型图中的每个值都对应于数据中的实际观测值:
>>> sns.boxplot(x="day", y="total_bill", hue="time", data=tips)
>>> plt.show()
   
   
  • 1
  • 2

1.png-8.9kB

  • 琴型图
    可以使用不同的方法:violinplot(),它结合boxplot()和分布中描述的核密度估计过程:
>>> sns.violinplot(x="total_bill", y="day", hue="time", data=tips)
>>> plt.show()
   
   
  • 1
  • 2

1.png-23.4kB

统计估计

通常,要显示值的集中趋势,而不是在每个类别中的分布。Seaborn有两种主要方式来显示这些信息:条形图和点图。

  • 条形图
>>> sns.barplot(x="sex", y="survived", hue="class", data=titanic)
>>> plt.show()
   
   
  • 1
  • 2

1.png-10.2kB

条形图的一种特殊情况是,想要显示每个类别中的观察值数量,而不是根据第二个维度变量的统计量。在seaborn中,使用countplot()函数:

>>> sns.countplot(x="deck", data=titanic, palette="Greens_d")
>>> plt.show()
   
   
  • 1
  • 2

1.png-6.9kB

barplot()和countplot()二者可以与上面讨论的所有选项一起调用:

>>> sns.countplot(x="deck", hue="class", data=titanic, palette="Greens_d")
>>> plt.show()
   
   
  • 1
  • 2

1.png-8.9kB

绘制多面板分类图

绘制多分类的图形最主要使用的就是factorplot()函数,使用factorplot()的主要优点是,很容易绘图同时观测其他分类变量以此来对照:

>>> sns.factorplot(x="time", y="total_bill", hue="smoker",
...                col="day", data=tips, kind="box", size=4, aspect=.5)
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-10.8kB

>>> sns.factorplot(x="day", y="total_bill", hue="smoker",
...                     col="time", data=tips, kind="swarm")
>>> plt.show()
   
   
  • 1
  • 2
  • 3

1.png-27.3kB



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是Matplotlib进阶代码示例: 1. 设置字体大小和样式 ```python import matplotlib.pyplot as plt plt.rcParams.update({'font.size': 14, 'font.family': 'Times New Roman'}) ``` 2. 添加图例 ```python import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2*np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) plt.plot(x, y1, label='Sin') plt.plot(x, y2, label='Cos') plt.legend(loc='upper right') plt.show() ``` 3. 设置坐标轴范围和标签 ```python import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) plt.plot(x, y) plt.xlim([0, 2*np.pi]) plt.ylim([-1, 1]) plt.xlabel('X Axis') plt.ylabel('Y Axis') plt.show() ``` 4. 添加文本注释 ```python import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) plt.plot(x, y) plt.annotate('Maximum', xy=(np.pi/2, 1), xytext=(np.pi/2, 1.5), arrowprops=dict(facecolor='black', shrink=0.05)) plt.show() ``` 5. 使用子图 ```python import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2*np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) fig, axs = plt.subplots(2, 1) axs[0].plot(x, y1) axs[0].set_title('Sin') axs[1].plot(x, y2) axs[1].set_title('Cos') plt.show() ``` 这些示例代码可以帮助您更好地理解Matplotlib的高级功能。 ### 回答2: Matplotlib是一种Python的数据可视化库,可以帮助我们创建各种类型的图表和图形。下面是一些Matplotlib进阶代码的示例: 1. 子图划分: 使用`plt.subplot()`函数可以将整个绘图区域划分为多个子图,可以是网格状或自定义形状。可以通过指定行数、列数和子图位置来确定子图的位置。 2. 图表样式设置: 使用`plt.style`来设置图表的样式,如带有背景网格的`'ggplot'`风格或简洁的`'seaborn'`风格等。 3. 自定义图表颜色: 可以使用RGB、HEX或颜色名称等方式来自定义图表中的颜色。例如,通过`color`参数指定颜色,或者通过`plt.cm.colors`模块使用更高级的颜色映射。 4. 图表标签和注释: 使用`plt.xlabel()`和`plt.ylabel()`函数可以设置横轴和纵轴标签,使用`plt.title()`函数可以设置图表标题。可以使用`plt.annotate()`函数在图表上添加注释。 5. 图例设置: 使用`plt.legend()`来添加图例并设置其位置。可以选择在图表内部或外部显示图例,也可以使用`bbox_to_anchor`参数进行更精细的位置控制。 6. 坐标轴设置: 可以使用`ax.tick_params()`函数来设置坐标轴的刻度、标签和网格线的样式。可以通过设置`xlabelpad`和`ylabelpad`参数来调整坐标轴标签与坐标轴之间的间距。 7. 3D图形绘制: Matplotlib还提供了在三维空间中绘制点、线和曲面的功能。可以使用`mpl_toolkits.mplot3d`模块中的`Axes3D`对象来创建三维坐标系。 8. 动画效果: 通过使用`animation`模块,可以在Matplotlib中创建动画效果。可以使用`FuncAnimation`函数来生成一个动画对象,并通过`save()`函数将动画保存为视频或动态GIF。 这只是一些Matplotlib进阶代码示例,实际应用中还有更多的功能和技巧。通过不断学习和实践,可以在数据可视化中充分发挥Matplotlib的优势。 ### 回答3: Matplotlib是一个用于绘制数据可视化图形的Python库。它提供了广泛的绘图选项和灵活的配置参数,使得用户可以轻松地创建各种类型的图形。 Matplotlib进阶代码包括许多功能和技巧,可以让图形更加美观和具有专业水准。以下是一些可以用于进阶Matplotlib代码的示例: 1. 改变图形风格:Matplotlib提供了不同的图形风格供选择,可以通过设置`plt.style.use()`来更改图形的样式,例如:"ggplot"、"seaborn"、"fivethirtyeight"等。 2. 自定义颜色和线型:可以通过设置`plt.plot()`函数的`color`和`linestyle`参数来自定义图形的颜色和线型。 3. 添加图例和标签:可以通过`plt.legend()`函数来添加图例,通过`plt.xlabel()`和`plt.ylabel()`函数来添加坐标轴标签。 4. 设置坐标轴刻度:可以使用`plt.xticks()`和`plt.yticks()`函数来设置坐标轴的刻度值,并通过`rotation`参数来旋转刻度标签。 5. 添加注释和文本:可以使用`plt.text()`和`plt.annotate()`函数来添加注释和文本,以增加图形的可读性和说明性。 6. 子图布局和图形尺寸:可以使用`plt.subplots()`函数创建包含多个子图的布局,通过`plt.figure()`函数设置图形的尺寸和分辨率。 7. 使用各种图形类型:除了常见的折线图和散点图外,Matplotlib还支持绘制柱状图、饼图、箱线图、等高线图等多种图形类型。 8. 添加背景和网格线:可以使用`plt.grid()`函数来添加网格线,使用`plt.axhspan()`和`plt.axvspan()`函数来添加背景色。 9. 保存和导出图形:通过`plt.savefig()`函数可以将图形保存为常见的图像格式,如PNG、JPEG等。 10. 添加动画效果:使用Matplotlib的`animation`模块可以创建动画效果,通过逐帧绘制来展示数据的演变过程。 以上是进阶Matplotlib的一些常用代码示例,通过了解和运用这些功能,可以更加灵活地使用Matplotlib库来绘制专业水平的数据可视化图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值