python数据可视化(matplotlib)

数据可视化

基本概念

数据可视化是指借助于图形化的手段,清晰、快捷有效的传达与沟通信息。同时,也可以辅助用户做出相应的判断,更好的去洞悉数据背后的价值。

字不如表,表不如图。

观察号码的频率,每个号码出现了多少次?

文字

08 10 15 20 30 31 33 06
01 09 10 17 21 28 32 13
02 05 08 13 19 21 28 10
03 05 07 14 18 23 25 07
…… ……

表格

图形

通过可视化图表方式,就可以清晰的表达信息

可视化图形辅助决策

1854 年英国伦敦霍乱病流行时,斯诺博士在绘有霍乱流行地区所有道路、房屋、饮用水机井等内容的城区地图上,标出了每个霍乱病死者的住家位置,得到了霍乱病死者居住位置分布图,发现了霍乱病源之所在:布劳德大街(现布劳维克大街)的公用抽水机

matplotlib

matplotlib是用于Python的绘图库,提供各种常用图形的绘制。例如,条形图,柱形图,线图,散点图等。

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

图形绘制

绘制线图

可以通过matplotlib.pyplot的plot方法进行图形绘制。

  • plot(y)
  • plot(y, '格式')
  • plot(x, y)
  • plot(x, y, '格式')
  • plot(x1, y1, '格式1', x2, y2, '格式2' …… xn, yn, 格式n)
# 绘制一个点,点默认情况下是不显示的。如果需要让点能够显示,需要设置(marker参数可以设置点显示的形状)。
# plt.plot(50, marker="d")

# 绘制多个数据,构成线型形状。如果我们只提供一组数组,则该组数据表示纵坐标,横坐标默认从0开始,1,2,3,4进行排列。
# plt.plot([3, 2, 9, 15, -3], marker="o")

# 我们也可以自己来指定横坐标。提供两组数据。第1个列表指定横坐标,第2个列表指定纵坐标。
# plt.plot([-3, -1, 5, 8, 12], [2, -10, 9, 3, 6], marker="o")

# 我们在绘制图形的时候,可以指定点的形状,线的形状,线条颜色等设置。
# plt.plot([-3, -1, 5, 8, 12], [2, -10, 9, 3, 6], "y-.>")

# 绘制多个数据,每个数据给予不同的格式。
# plt.plot([-3, -9], [32, 18], "r--D", [5, 8], [-10, 20], "g-.o")

# 以上的方式,我们也可以分成两步来进行绘制。
plt.plot([-3, -9], [32, 18], "r--D")
plt.plot([5, 8], [-10, 20], "g-.o")
[<matplotlib.lines.Line2D at 0x1c986a6d080>]
 
 

图形交互式设置

我们可以设置jupyter notebook图形是否交互式显示,默认为否。

  • %matplotlib 引擎名
  • %matplotlib inline
# %matplotlib qt
%matplotlib inline
plt.plot([5, 8], [-10, 20], "g-.o")
[<matplotlib.lines.Line2D at 0x20f80f3e0b8>]
 

设置中文支持

matplotlib默认情况下不支持中文显示,如果需要显示中文,则我们需要做一些额外的设置操作。设置可以分为:

  • 全局设置
  • 局部设置

全局设置

我们可以通过执行:
mpl.rcParams["font.family"] = "中文字体名称"
mpl.rcParams["axes.unicode_minus"]=False
进行设置。常用的设置如下:

  • font.family 字体的名称
    • sans-serif 西文字体(默认)
    • SimHei 中文黑体
    • FangSong 中文仿宋
    • YouYuan 中文幼圆
    • STSong 华文宋体
    • Kaiti 中文楷体
    • LiSu 中文隶书
  • font.style 字体的风格
    • normal 常规(默认)
    • italic 斜体
    • oblique 倾斜
  • font.size 字体的大小(默认10)
  • axes.unicode_minus 是否使用Unicode的减号(负号)【在支持中文显示状态下,需要设置为False】

局部设置

在需要显式的文字中,使用fontproperties参数进行设置。

说明:

  • 如果全局设置与局部设置冲突,以局部设置为准。
# 对字体进行设置。默认的字体不支持中文显示,我们只需设置一种支持中文显示的字体即可。
mpl.rcParams["font.family"] = "Kaiti"
# 对于西方文字,使用普通的负号来显示,无需设置该选项。当设置支持中文的字体时,会使用Uniocde的负号来进行显示(不支持)。故需要将
# 负号显示成普通的形式,而不是使用Unicdoe的负号显示。
mpl.rcParams["axes.unicode_minus"] = False
mpl.rcParams["font.style"] = "normal"
mpl.rcParams["font.size"] = 10
plt.plot([-3, -2],[-1, -5], "r--")
# 显示标题
plt.title("中文")

# 局部设置
plt.title("中文", fontproperties="Kaiti", fontsize=20)
Text(0.5, 1.0, '中文')
 
 

保存图表

通过plt的savefig方法将当前的图形保存到硬盘或者类文件对象中。

  • dpi:每英寸分辨率点数。
  • facecolor:设置图像的背景色。
  • bbox_inches:设置为tight,可以紧凑保存图像。
  • # savefig图表保存
    # 1 保存到硬盘上
    plt.plot([1, 5, 8, 10], [2, 3, 9, 6], "r-.o")

    plt.savefig("./1.png", dpi=100, facecolor="g", bbox_inches="tight") # 2 保存到类文件对象中 # from io import BytesIO # data = BytesIO() # plt.savefig(data) # data.read() # data.getvalue()[:100] from PIL import Image # 从硬盘读取文件 image = Image.open("./1.png") # 从类文件对象中读取信息 # image = Image.open(data) image.show()

颜色,点标记与线型设置

我们可以在绘制图形时,显式指定图形的颜色,点标记或线条形状。具体设置可以查看帮助文档。

  • color(c):线条颜色。
  • linestyle(ls):线条形状。
  • linewidth(lw):线宽。
  • marker:点标记形状。
  • markersize(ms):点标记的大小。
  • markeredgecolor(mec):点边缘颜色。
  • markeredgewidth(mew):点边缘宽度。
  • markerfacecolor(mfc):点的颜色。

说明:

  • 颜色,点标记与线型可以使用一个参数进行设置。
  • 颜色除了可以使用预设简写的字符之外,也可以使用全称(例如red)也可以使用RGB颜色表示。
# plt.plot([1, 2, 3, 4], [5, 6, 7, 8], "ro--")
plt.plot([1, 2, 3, 4], [5, 6, 7, 8], c="r", ls="--", lw=2, marker="o", ms=15, mec="r", mew=5, mfc="y")
[<matplotlib.lines.Line2D at 0x1c986f302b0>]
 

透明度设置

在绘制图像时,我们可以通过alpha参数来控制图像的透明度,值在0 ~ 1之间。0为完全透明,1为不透明。

 
plt.plot(np.arange(30), marker="D", alpha=0.7)
[<matplotlib.lines.Line2D at 0x20f80f6ab00>]
 
 

图例设置

在绘制多条线时,可以设置图例来标注每条线所代表的含义,使图形更加清晰易懂。
可以采用如下的方式设置图例:

  • 调用plt的legend函数,传递一个标签数组,指定每次plot图形的标签。
  • 在绘制的时候通过label参数指定图例中显示的名称,然后调用legend函数生成图例。

legend常用的参数:

  • loc:指定图例的位置。默认为best。也可以指定坐标(元组),基于图像左下角计算。
  • frameon:设置是否含有边框。
  • title:设置图例的标题。
  • ncol:图例显示的列数,默认为1。
# 可以采用两种方式。
# plt.legend设置显示图例。

# 1 第一中方式,绘图时不指定标签,而在legend方法中指定标签。
plt.plot(list(range(1, 13)), np.random.randint(50, 100, 12))
plt.plot(list(range(1, 13)), np.random.randint(50, 100, 12))
# loc 控制图例的显示位置,默认为best,即选择一个最好的位置。
plt.legend(["2016", "2017"], loc="upper right")

# legend也可以指定元组的坐标。(坐标的值基于当前图形的比例。)
# plt.legend(["2016", "2017"], loc=(0.6, 0.5))
# frameon是否显示图例的边框,True(默认值)显示,False不显示。
# plt.legend(["2016", "2017"], loc="best", frameon=False)
# plt.legend(["2016", "2017"], loc="best", title="年降雨量", ncol=2)

# 2 第2种方式:在绘图时指定标签,在legend中不指定。
# 通过label参数指定标签信息。该信息可以用来当做legend的图例标签。
plt.plot(list(range(1, 13)), np.random.randint(50, 100, 12), label="2016")
plt.plot(list(range(1, 13)), np.random.randint(50, 100, 12), label="2017")
plt.legend(loc="best")

网格设置

可以通过plt的grid方法来设置是否显示网格。True为显示,False不显示。ax.grid(color='r', linestyle='-', linewidth=2)

  • color:设置网格线颜色
  • axis:设置网格线显示x,y或者全部显示(x,y,both)。
  • linestyle:设置网格线形状。
  • linewidth:设置网格线宽度。
plt.plot([1, 2], [3, 4])
plt.grid(True, color="y", axis="y", ls="--", lw=5)

绘图区域设置

我们可以在一张图上绘制多个图形,当然,我们也可以将不同的图形绘制到多个不同的区域当中。
我们可以采用以下方式来实现多个区域的绘制(创建子绘图区域):

  • 通过Figure对象调用add_subplot方法。
  • 通过plt的subplot方法。
  • 通过plt的subplots方法。
 

子区域1:add_subplot方法

  • 首先创建matplotlib.figure.Figure对象,然后通过Figure对象的add_subplot方法增加子绘图区域。
  • add_subplot方法中,需要指定子区域的行数、列数与当前要绘制的子区域。
  • add_subplot方法会返回子绘图对象(轴对象),通过该对象即可实现绘图(matplotlib.axes._subplots.AxesSubplot)。

在绘制图形时,总是需要创建Figure对象。如果没有显式创建,则plt会隐式创建一个Figure对象。在绘制图形时,既可以使用plt来绘制,也可以使用子绘图对象来绘制。
如果使用plt对象绘制,则总是在最后创建的绘图区域上进行绘制,如果此时尚未创建绘图区域,则会自动创建。

说明:

  • add_subplot方法的参数,即可以使用三个参数分开传递,也可以使用一个参数整体传递。
  • 可以通过plt.subplots_adjust方法来调整子绘图的位置与子绘图之间的距离。(left, right, top, bottom, wspace, hspace)
  • 创建子区域时,可以使用facecolor设置绘图区域的背景色。
# 创建Figure对象。在我们进行绘图时,一定会存在Figure对象,如果我们没有显式创建,也会隐式创建。
figure = plt.figure()
# 创建一个子绘图区域,分别指定行数(第1个参数),列数(第2个参数),当前的自绘图区域(第3个参数)。
figure.add_subplot(1, 2, 1, facecolor="g")
plt.plot(10, marker="o")
# 三个参数也可以作为一个参数整体传递
figure.add_subplot("122")
# figure.add_subplot(1, 2, 2)
plt.plot(20, marker="d")

# 在调用add_subplot方法时,会返回所创建的子绘图区域对象。我们既可以通过plt.plot进行绘制,也可以通过子绘图区域的plot方法
# 进行绘制。
# sub = figure.add_subplot(1, 2, 1)
# sub.plot([1, 2, 3], [5, 6, 8], "g")
# 当我们使用plt.plot进行绘制时,总是在最后激活(创建)的子绘图区域上进行绘制。 
# sub2 = figure.add_subplot(1, 2, 2)
# plt.plot([3, 8, 9], [12, 9, 0], "y")

# 调整水平的间距。
plt.subplots_adjust(wspace=1)

子区域2:subplot方法

通过调用plt的subplot方法创建子绘图区域,该方法返回子绘图对象。此处方式下,会隐式创建Figure对象。
实际上,这种创建子绘图区域的方式,底层也是通过第一种方式实现的。

#subplot(行, 列, 当前位置)
plt.subplot(1, 2, 1)
plt.plot([3, 8, 3], "g--d")

plt.subplot(1, 2, 2)
plt.plot([3, 8, 9], "r-.o")

子区域3:subplots方法

通过plt的subplots方法创建子绘图区域,该方法返回一个元组(Figure对象与所有子绘图对象,如果是多个子绘图对象,则返回一个ndarray数组)。可以通过sharex与sharey来指定是否共享x轴与y轴。

# 返回元组, 第1个元素,Figure对象,第2个元素:子绘图区域对象。
# 如果我们创建多个子绘图区域对象,则多个子绘图区域对象会存放在ndarray中。
figure, ax = plt.subplots(2, 2, sharex=True, sharey=True)

ax[0][0].plot([3, 9])
ax[0][1].plot([3, 9])
ax[1][0].plot([3, 9])
ax[1][1].plot([3, 9])

绘图区域大小设置

如果绘图子区域较多,可能会有些拥挤。此时,我们可以调整绘图区域的大小。方式如下:

  • 在调用plt.figure()创建Figure对象时,通过figsize参数指定。单位为英寸。
  • 在创建Figure对象后,可以通过Figure对象的set_size_inches方法设置。

说明:

  • 如果没有显式创建Figure对象,可以通过plt的gcf函数获取当前的Figure对象。
# 在创建Figure对象时,通过figsize参数指定绘图区域的大小。
# plt.figure(figsize=(3, 3))

# 我们也可以在创建Figure对象之后,通过set_size_inches来设置区域大小。
# figure = plt.figure()
# figure.set_size_inches(5, 5)
# plt.plot([1, 2, 4])
# 获取当前的figure对象。
# 如果没有显式创建Figure对象,我们可以通过plt.gcf获取当前使用的figure,同样可以设置绘图区域的大小。
figure2 = plt.gcf()
# display(figure is figure2)
figure2.set_size_inches(5, 5)
plt.plot([1, 2, 3])

标签与刻度设置

可以通过plt对象的相关方法来设置(或获取)标签与刻度等信息。设置还是获取,取决于是否传递实际参数。

  • plt.xlim 设置或获取x轴刻度范围。
  • plt.ylim 设置或获取y轴刻度范围。
  • plt.xticks 设置或获取x轴显示的刻度与标签。
  • plt.yticks 设置或获取y轴显示的刻度与标签。
  • plt.axis 可以同时设置或获取x与y轴的刻度范围,或者是取消刻度显示。
    • 无参数:返回一个元组。(xmin, xmax, ymin, ymax)
    • (xmin, xmax, ymin, ymax) 同时设置x与y轴的刻度范围。
    • off 取消坐标轴显示。
    • tight:坐标轴紧凑显示。
    • equal:x与y具有同样的长度。

轴标签说明与标题设置

  • plt.xlabel 设置x轴的标签说明。
  • plt.ylabel 设置y轴的标签说明。
  • plt.title 设置标题。
plt.plot([1, 3, 5], [2, 4, 6])
# 显示x轴刻度的范围
display(plt.xlim())
# 显示y轴刻度的返回
display(plt.ylim())
# 除了获取之外,我们也可以去设置x与y轴的刻度范围。
plt.xlim(0, 10)
plt.ylim(-2, 10)
# 获取x与y的刻度信息。
# plt.xticks()
# plt.yticks()

# 设置x与y的刻度信息
plt.xticks([0, 5, 10])
plt.yticks([-2, 4, 10])

# 默认情况下,标签就是我们设置的刻度信息。我们可以自定义每个刻度的显示标签。
plt.xticks([0, 5, 10], ["偏低", "中等", "偏高"])
(0.8, 5.2)
 
(1.8, 6.2)
([<matplotlib.axis.XTick at 0x1c98824cd30>,
  <matplotlib.axis.XTick at 0x1c98824c7f0>,
  <matplotlib.axis.XTick at 0x1c98824c518>],
 <a list of 3 Text xticklabel objects>)
 
 
# axis的使用
# plt.plot([1, 3, 5], [2, 4, 6])
# 可以通过axis来设置或者返回x与y轴的界限。
# 获取 
plt.axis()
# 设置 (xmin, xmax, ymin, ymax)
# plt.axis((0, 10, -5, 10))
# 去掉坐标轴
# plt.axis("off")

plt.plot([1, 2, 3], [1, 10, 20])
# 让x与y轴具有相同的增长度(比例相同)
# plt.axis("equal")

# 设置坐标轴的标签与标题
plt.plot([1, 2, 3])
# 设置x轴的标签信息
plt.xlabel("这是x轴")
plt.ylabel("这是y轴")
# 设置标题信息
plt.title("这是标题")
Text(0.5,1,'这是标题')
 

通过绘图对象设置

除了通过plt对象外,我们还可以通过子绘图对象来设置与获取标签与刻度。

  • ax.set_xlim 设置x轴刻度范围。
  • ax.get_xlim 获取x轴刻度范围。
  • ax.set_xticks 设置x轴显示的刻度。
  • ax.get_xticks 获取x轴显示的刻度。
  • ax.set_xticklabels 设置x轴显示的刻度标签。默认显示的是就是刻度值。
  • ax.get_xticklabels 获取x轴显示的刻度标签。

也可以设置标签说明与标题。

  • ax.set_xlabel 设置x轴的标签说明。
  • ax.get_xlabel 获取x轴的标签说明。
  • ax.set_title 设置标题。
  • ax.get_title 获取标题。

说明:

  • 如果需要设置或者获取y轴,只需要将x换成y即可。
# 除了使用plt进行设置刻度,坐标轴,标签等信息外,我们也可以通过绘图对象来进行设置。
figure, ax = plt.subplots(1, 1)
ax.plot(np.random.random(100))
# 设置x轴的显示范围
# ax.set_xlim(0, 120)
# 获取x轴的显示范围
# ax.get_xlim()
# ax.get_xticks()
ax.set_xticks([50, 100, 150])
ax.set_xticklabels(["", "", ""])
# for i in ax.get_xticklabels():
#     display(i)
ax.set_xlabel("时间")
ax.set_ylabel("数值大小")
# ax.get_xlabel()
ax.set_title("波动值")
ax.get_title()
'波动值'
 
 

添加注解

我们可以在图形上绘制文本等说明信息(注解)。

普通文本

plt.text 显示文本(基于坐标)
plt.figtext 显示文本(基于图片)

箭头

plt.arrow 根据起点坐标(x,y)与各自轴的长度(x + dx, y + dy)绘制箭头。

  • width 箭头尾部的宽度。
  • head_width 箭头的宽度。
  • head_length 箭头的长度。

箭头与文本

plt.annotate 显示箭头与文本。

  • xy 箭头指向坐标
  • xytext 文本起点坐标。(箭头尾部坐标)
  • arrowprops 字典类型,可设置箭头的属性。
    • facecolor 箭头的颜色
    • headwidth 箭头的宽度
    • width 箭尾的宽度
    • shrink 收缩大小
    • headlength 箭头的长度
    • arrowstyle 一些预设的箭头样式。当含有该参数时,上述4项参数将不再有效。
x = np.linspace(-10, 10, 100)
plt.plot(x, x ** 2, "-")
plt.title("抛物线图")
# 在指定的坐标位置增加文字说明。
# plt.text(0.5,0, "这是极值点")
# plt.text与plt.figtext都可以进行文字说明,不同的是,text是基于坐标定位,而figtext是基于比例定位(左下角为原点)。
# plt.figtext(0.5, 0.5, "说明")
# plt.arrow(7, 20, -5.5, -15, width=1, head_width=4, head_length=4, color="r")
# plt.text(8, 25, "这是极值点")

# 使用text与arrow可以实现箭头与文本的说明。我们可以使用plt.annotate可以将箭头与说明文本一同绘制。
# plt.annotate("这是极值点", xy=(0, 0), xytext=(8, 25), arrowprops=dict(width=3, facecolor="g", headwidth=15, shrink=0.05, headlength=25))

plt.annotate("这是极值点", xy=(0, 0), xytext=(8, 25), arrowprops=dict(arrowstyle="<-"))
Text(8, 25, '这是极值点')
 

图形类型

折线图

plt.plot

# 适合于具有增长趋势的数据表达
plt.plot(np.arange(1, 13), np.random.randint(50, 100, 12), "-o")

柱形图 / 条形图

plt.bar 柱形图
plt.barh 条形图

# 柱形图/条形图适合进行数据数值的对比(比较大小)。

# 绘制柱形图
# plt.bar(["A公司", "B公司", "C公司"], [200, 100, 135])
# 绘制条形图
plt.barh(["A公司", "B公司", "C公司"], [200, 100, 135])
<BarContainer object of 3 artists>
 
 

饼图

plt.pie 饼图

  • labels 每个部分显示的标签。
  • explode 指定每个部分距离圆心的偏移量(单位为半径的长度)。
  • colors 指定每个部分的颜色。
  • autopct 设置每个部分显示的比例值(格式化)。
  • couterclock 是否逆时针绘图。默认为True。
  • startangle 初始绘图点位置(逆时针偏移x轴的角度)。默认为偏移0度(x轴)。
  • shadow 是否含有阴影,默认为False。
# 饼图适合于进行比例的对比。(注意:使用饼图时,参与对比的数据不宜过多。)

plt.pie([10, 30, 20, 50, 40], labels=["销售1部", "销售2部", "销售3部", "技术1部", "技术2部"], explode=[0, 0, 0, 0, 0.2])
# plt.pie([10, 30, 20, 50, 40], labels=["销售1部", "销售2部", "销售3部", "技术1部", "技术2部"], colors=["r", "g", "b", "y", "b"])
# plt.pie([10, 30, 20, 50, 40], labels=["销售1部", "销售2部", "销售3部", "技术1部", "技术2部"],autopct="%.2f%%")
# plt.pie([10, 30, 20, 50, 40], labels=["销售1部", "销售2部", "销售3部", "技术1部", "技术2部"],counterclock=False)
# plt.pie([10, 30, 20, 50, 40], labels=["销售1部", "销售2部", "销售3部", "技术1部", "技术2部"], startangle=90)
# plt.pie([10, 30, 20, 50, 40], labels=["销售1部", "销售2部", "销售3部", "技术1部", "技术2部"],shadow=True)
([<matplotlib.patches.Wedge at 0x1c9883cfc18>,
  <matplotlib.patches.Wedge at 0x1c9883d91d0>,
  <matplotlib.patches.Wedge at 0x1c9883d96a0>,
  <matplotlib.patches.Wedge at 0x1c9883d9b70>,
  <matplotlib.patches.Wedge at 0x1c9883e4080>],
 [Text(1.075962358309037, 0.22870287165240302, '销售1部'),
  Text(0.5499999702695115, 0.9526279613277875, '销售2部'),
  Text(-0.5500000594609755, 0.9526279098330699, '销售3部'),
  Text(-1.004899951743044, -0.44741042342219545, '技术1部'),
  Text(0.8698699721849806, -0.9660881075196512, '技术2部')])
 
 

散点图 / 气泡图

散点图适合于用来显示与比较数据的分布状态。

  • marker 点的标记。
  • s 点的大小。
  • color 点的颜色。

说明:

  • color与s参数可以统一设置,也可以为每一个点单独设置。
# 散点图/气泡图适合于表示数据的分布情况。
# 散点图用来表示两个维度的数据,如果数据维度超过2维,我们可以使用气泡图表示。【增加气泡的大小,颜色,多表示两个维度】

plt.scatter(np.random.randint(0, 100, 100), np.random.randint(0, 100, 100), marker="o", s = 30, c="g")
# plt.scatter([1, 5, 8], [8,2, 6], s=[30, 100, 60], c=["r", "g", "b"])

直方图

直方图(histogram)可以看成是一种特殊的柱形图,用来将连续的数据频率(数量)进行离散化显示。在直方图中,数据被分割成若干区间,然后统计每个区间数据出现的频率(数量)。
我们可以通过plt.hist来绘制直方图。

    • bins:设置分割区间的数量。
    • normed:进行归一化显示。(概率密度)
    • # 直方图适用于将连续型变量(多离散型)切分成离散型表示。
      
      
      # x = np.random.randint(0, 101, 200)
      # 默认情况下,直方图会划分成10等分区间。
      # 区间的划分原则:左闭右开原则。(包含起始点,不包含终止点。)例外:最后一个区间,双闭区间。(包含起始点,也包含终止点。)
      # plt.hist(x)
      # 如果需要自定义区间数量(等分数量:桶的数量),我们可以通过bins进行控制。
      # plt.hist(x, bins=5)
      # bins参数,除了指定一个标量(区间桶的数量)之外,我们也可以传递一个数组。数组指定我们自定义划分的界限。
      # plt.hist(x, bins=[0, 10, 50, 100])
      
      # 正态分布
      x = np.random.randn(200)
      plt.hist(x, bins=8)
      (array([ 6., 14., 17., 48., 51., 36., 19.,  9.]),
       array([-2.89321226, -2.25176974, -1.61032721, -0.96888469, -0.32744217,
               0.31400035,  0.95544287,  1.5968854 ,  2.23832792]),
       <a list of 8 Patch objects>)
       
       

      箱线图

      箱线图也称盒须图。通过极值与Q1,Q2,Q3值来描述数据。

      通过箱线图,我们可以发现数据中的离群(异常)值。 箱线图的离群点定义为:Q3+1.5IQR和Q1-1.5IQR。其中IQR为两个四分位之间的距离。

      # 使用箱线图能够方便我们进行离群点的检测。(发现可能的异常值。)
      
      a = [2, 3, 5, 1, 4, 2, 6]
      # df = pd.DataFrame(a)
      # display(df)
      # df.describe()
      plt.boxplot([2, 3, 5, 1, 4, 2, 9])
      {'whiskers': [<matplotlib.lines.Line2D at 0x1c986f57358>,
        <matplotlib.lines.Line2D at 0x1c986f576a0>],
       'caps': [<matplotlib.lines.Line2D at 0x1c986f579e8>,
        <matplotlib.lines.Line2D at 0x1c986f57d30>],
       'boxes': [<matplotlib.lines.Line2D at 0x1c988466ef0>],
       'medians': [<matplotlib.lines.Line2D at 0x1c986f57e10>],
       'fliers': [<matplotlib.lines.Line2D at 0x1c986f5b400>],
       'means': []}
       
       

      Series与DataFrame图形绘制

      Series与DataFrame类型的对象也支持图形绘制,使用对象的plot方法即可。
      如果我们需要绘制图形的数据就存在Series或者DataFrame对象中,我们就可以直接绘制,而无需使用plt.plot。

       

      其他类型图形

      plot默认绘制的是线形图,我们可以通过调整其kind参数的值来绘制其他类型的图形。

      • line:线形图
      • bar:柱形图
      • barh:条形图
      • hist:直方图
      • kde / density:核密度图
      • pie:饼图
      • box:箱线图
      • area:面积图

      参数:

      • color
      • alpha
      • stacked:是否堆叠。

      说明: plot(kind="类型")也可以通过plot."类型"来进行绘制。

       
      # s = pd.Series([1, 3, 8, 10, 12])
      # s.plot(kind="line", marker="o", color="g")
      # s.plot.line()
      # s.plot(kind="bar")
      # s.plot(kind="barh")
      # s.plot.barh()
      # s.plot(kind="hist")
      # s.plot(kind="kde")
      # s.plot(kind="density")
      # s.plot(kind="pie")
      # s.plot(kind="box")
      # s.plot(kind="area", alpha=0.5)
      df = pd.DataFrame({"A":[10, 5, 8, 7], "B":[12, 11, 3, 6]})
      display(df)
      # df.plot(kind="line")
      # 进行堆叠
      # df.plot(kind="bar", stacked=True)
      # df.plot(kind="barh", stacked=True)
      # df.plot(kind="hist")
      # df.plot(kind="kde")
      # DataFrame在绘制饼图的时候,需要指定y或subplots=True。
      # y指定列索引。(要绘制哪一个列)
      # df.plot(kind="pie", y="B")
      # 如果DataFrame中的每个列都需要绘制饼图,可以使用subplots=True,这样,就可以将每个列在各自的子绘图区域中绘制饼图。
      # df.plot(kind="pie", subplots=True)
      # 每个列绘制一个箱线图。
      # df.plot(kind="box")
      df.plot(kind="area")

原文地址:https://www.cnblogs.com/lqerio/p/11168667.html