# 可以采用两种方式。
# 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)
# 创建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], ["偏低", "中等", "偏高"])
([<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("这是标题")
通过绘图对象设置
除了通过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 获取标题。
说明:
# 除了使用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="<-"))
图形类型
折线图
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")