可以通过plt的grid方法来设置是否显示网格。True为显示,False不显示。ax.grid(color=‘r’, linestyle=’-’, linewidth=2)
plt.plot([1, 2, 3], [4, 5, 6])
# 设置网格
# plt.grid()
plt.grid(color="r", axis="both", linestyle="--", linewidth=3)
## 绘图区域设置
我们可以在一张图上绘制多个图形,当然,我们也可以将不同的图形绘制到多个不同的区域当中。
我们可以采用以下方式来实现多个区域的绘制(创建子绘图区域):
* 通过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对象的add_subplot方法。
# Figure对象是我们绘制图形的一个底层对象。提供绘图的支持(相当于是画布)。
# 我们要绘制图形,就必须创建Figure对象才可以。我们之前在使用plt.plot进行绘制图形时,
# 如果没有显式创建Figure对象,则会隐式自动创建一个。
figure = plt.figure()
# type(figure)
# 创建自绘图区域,返回子绘图区域对象(AxesSubplot)。3个参数:
# 第1个参数:子绘图区域的行数
# 第2个参数:子绘图区域的列数
# 第3个参数:当前创建的子绘图区域索引(序号),注意:索引从1开始。
ax = figure.add_subplot(1, 2, 1)
# 三个参数也可以使用一个str类型,整体进行传递。
# ax = figure.add_subplot("121")
# 当创建好子绘图区域后,我们就可以通过子绘图区域对象,来进行绘制图形(plot方法)。
# ax.plot([1, 3, 5], [10, 15, 20], marker=">")
# plt.plot([2, 3], [5, 6])
# ax2 = figure.add_subplot(1, 2, 2)
# ax2.plot([10, -5, 9], [1, 5, 7], marker="*")
# plt.plot([2, 3], [5, 6])
# 我们之前使用plt.plot绘制图形时,其实,底层就是使用子绘图区域对象来进行绘图的。
# plt.plot总是在最后一个创建的子绘图区域上进行绘制。
# 使用plt.plot也可以代替ax.plot(ax为子绘图区域对象)。但是,这有一个前提:
# 当创建新的子绘图区域后,我们不会在原有的(老的)子绘图区域上再进行绘制。
# 在创建自绘图区域时,可以通过facecolor参数来指定自绘图区域的背景色。
figure.add_subplot(1, 2, 1, facecolor="g")
plt.plot([1, 3, 5], [10, 15, 20], marker=">")
plt.plot([2, 3], [5, 6])
figure.add_subplot(1, 2, 2)
plt.plot([10, -5, 9], [1, 5, 7], marker="*")
plt.plot([2, 3], [5, 6])
# 控制调整子绘图区域之间,以及子绘图区域与画布之间的距离。
# plt.subplots_adjust(wspace=0.5)
通过调用plt的subplot方法创建子绘图区域,该方法返回子绘图对象。此处方式下,会隐式创建Figure对象。
实际上,这种创建子绘图区域的方式,底层也是通过第一种方式实现的。
# 创建自绘图区域的第二种方法。通过plt.subplot方法。
# 该方法底层是通过第一种方法来实现的。
ax = plt.subplot(1, 2, 1)
ax.plot([1, 2, 3], [4, 5, 6])
plt.subplot(1, 2, 2)
plt.plot([5, 6, 7], [10, 12, 14])
通过plt的subplots方法创建子绘图区域,该方法返回一个元组(Figure对象与所有子绘图对象,如果是多个子绘图对象,则返回一个ndarray数组)。可以通过sharex与sharey来指定是否共享x轴与y轴。
# 第三种创建自绘图区域的方式:通过plt.subplots方法。
# 第三种方式与前两种方式的不同:前两种方式是一次创建一个自绘图区域,而第三种方式是一次性
# 将所有的子绘图区域都创建好。
# 该方法返回元组类型。元组中含有两个元素(figure对象, 所有子绘图区域对象构成的数组)
# 注意元组中第2个元素的类型:
# 1 当subplots的两个参数(行数与列数)都为1时,该类型为子绘图区域对象类型(AxesSubplot)。
# 2 当subplots的两个参数其中一个为1,一个大于1时,该类型为一维ndarray数组类型。
# 3 当subplots的两个参数全部大于1时,该类型为二维ndarray数组类型。
# fig, ax = plt.subplots(1, 2)
# ax[0].plot([1, 2, 3], [1, 2, 3])
# ax[1].plot([10, 20, 30], [40, 50, 60])
# fig, ax = plt.subplots(2, 2)
# ax[0,0].plot()
# 在创建子绘图区域时,我们可以设置sharex与sharey参数为True,这样,就可以通向x(y)轴的刻度。
fig, ax = plt.subplots(1, 2, sharex=True, sharey=True)
ax[0].plot([1, 2, 3], [1, 2, 3])
ax[1].plot([10, 20, 30], [40, 50, 60])
如果绘图子区域较多,可能会有些拥挤。此时,我们可以调整绘图区域的大小。方式如下:
plt.figure()
创建Figure对象时,通过figsize参数指定。单位为英寸。说明:
# 画布大小的设置。
# 可以在创建Figure对象的时候,进行设置。
# figsize 元组,指定宽度与高度,单位:英寸。
# fig = plt.figure(figsize=(10, 10))
# 也可以在创建Figure对象后,通过figure对象调用set_size_inches方法进行设置。
# fig = plt.figure()
# fig.set_size_inches(10, 10)
# plt.plot([5, 3])
# gcf(get current figure) 获取当前的figure对象。
# 如果我们显式创建了Figure对象,则plt.gcf不会再创建新的Figure对象,而是会返回我们之前创建的
# Figure对象。
fig = plt.figure()
figure = plt.gcf()
fig is figure
可以通过plt对象的相关方法来设置(或获取)标签与刻度等信息。设置还是获取,取决于是否传递实际参数。
# 默认情况下,坐标轴的刻度是根据我们绘制图形时x与y的取值范围进行调整的。
# 我们也可以自行来指定x与y轴的刻度与显示。
# plt.plot([10, 20, 30], [1, 1, 1])
# xlim 设置或获取x轴的刻度显示范围。
# 获取最小值与最大值。
# min_, max_ = plt.xlim()
# 设置最小值与最大值。
# plt.xlim(1, 100)
# 仅设置最小值或最大值中的一个。
# 仅设置最小值。
# plt.xlim(5)
# 仅设置最大值。
# min_, _ = plt.xlim()
# plt.xlim(min_, 100)
# plt.xlim(xmax=100)
# plt.ylim(-10, 10)
# 设置或获取x(y)轴的刻度。
# plt.xticks()
# plt.xlim(1, 50)
# plt.xticks(range(5, 55, 5))
# 在设置x(y)轴的刻度同时,我们还可以指定刻度所显示的标签内容。
# 如果没有显式设置标签,则标签显示的内容就是刻度值的内容。
# plt.xlim(0, 100)
# plt.xticks([60, 80, 90], ["及格", "良好", "优秀"])
# plt.axis 设置获取获取x与y两个轴的范围。
# plt.axis()
# plt.axis((5, 50, -3, 3))
# 取消坐标轴的显示。
# plt.axis("off")
# 让图形进行紧凑显示。
# plt.axis("tight")
# 让x轴与y轴等比例显示。
plt.plot([1, 2, 3], [5, 30, 60])
plt.axis("equal")
# 为x轴与y轴设置说明信息。
plt.xlabel("set x axis")
plt.ylabel("y axis")
# 为图形设置标题
plt.title("set some title")
除了通过plt对象外,我们还可以通过子绘图对象来设置与获取标签与刻度。
也可以设置标签说明与标题。
说明:
figure, ax = plt.subplots(1, 1)
# 我们也可以使用子绘图区域对象来设置或获取坐标轴刻度,标签等操作。
# 与plt不同,子绘图区域对象的设置与获取,是通过两个方法来实现的。
ax.set_xlim(1, 100)
print(ax.get_xlim())
ax.set_xticks([10, 50, 100])
# 在设置标签时,可以使用rotation参数来控制字体旋转的角度。这样,当刻度比较密集的时候,可以避免
# 便签之间进行重叠。
ax.set_xticklabels(["abcsadfa", "defasdf", "ihkasdfas"], rotation=60)
我们可以在图形上绘制文本等说明信息(注解)。
plt.text 显示文本(基于坐标)
plt.figtext 显示文本(基于图片)
plt.arrow 根据起点坐标(x,y)与各自轴的长度(x + dx, y + dy)绘制箭头。
plt.annotate 显示箭头与文本。
x = np.linspace(-10, 10, 500)
y = x ** 2
plt.plot(x, y)
# 增加文本说明。(基于坐标值)
plt.text(-8, 80, "这是抛物线")
x2 = np.linspace(-3, 4, 500)
y2 = np.exp(x2)
plt.plot(x2, y2)
plt.text(3.5, 60, "这是指数函数")
plt.text(0, 0, "这是最小值点")
# 增加文本说明,基于图像比例(原点在图像的左下角)
plt.figtext(0, 0.0, "说明")
x = np.linspace(-10, 10, 500)
y = x ** 2
plt.plot(x, y)
# 画箭头。x,y起始点坐标。dx,dy分别指定x与y的偏移量。终止点坐标(x + dx, y + dy)
# plt.arrow(-3, 40, 3, -40, width=0.3, head_length=1.5, head_width=1.0, color="r")
# plt.text(-5, 45, "这是极值点")
# 箭头文本一起画
# shrink参数:设置箭头缩水的比例。
# arrowstyle:使用内建的箭头样式。当arrowprops中含有该参数时,其他参数(width,headlength等)则无效。
# plt.annotate(xy=(0,0), xytext=(7.5,40), s="这是极值点", arrowprops={"width":0.5})
# plt.annotate(xy=(0,0), xytext=(7.5,40), s="这是极值点", arrowprops=dict(width=3.5, facecolor="r", headlength=5.8,
# headwidth=10, shrink=0.1))
plt.annotate(xy=(0,0), xytext=(7.5,40), s="这是极值点", arrowprops=dict(arrowstyle="<->"))
我们可以通过plt.style.use("样式名")
来设置绘图使用的样式。
说明:
执行plt.style.available
来获取所有的绘图样式。
# 查看当前所有可用的样式。
# plt.style.available
# 设置样式。
plt.style.use("ggplot")
plt.plot
# 折线图能够体现数据的增减变化,适合呈现具有趋势发展的数据。
plt.plot([1, 2, 3, 4], [5, -3, 7, -8], marker="o")
plt.bar 柱形图
plt.barh 条形图
# 柱形图 / 条形图适合体现数据的比较/对比。使用于数据比较大小的场景。
# plt.bar(x=["A", "B", "C"], height=[550, 480, 600])
plt.barh(y=["A", "B", "C"], width=[550, 480, 600])
plt.pie 饼图
# 饼图适合体现数据比例的分配对比。(饼图不适合展示过多的数据)
# plt.pie([1, 2, 3, 4])
# labels 显示每个数据的标签。
# plt.pie([1, 2, 3, 4], labels=["A", "B", "C", "D"])
# explode 用来指定每个数据(每张饼距离圆心的距离,默认为0),单位为半径。
# 作用:用来突出显示某一个(几个)数据。
# plt.pie([1, 2, 3, 4], labels=["A", "B", "C", "D"], explode=[0, 0, 0, 0.5])
# colors用来设置每个部分的颜色。
# plt.pie([1, 2, 3, 4], labels=["A", "B", "C", "D"],colors=["r", "g", "b", "y"])
# autopct 设置每个部分的百分比。
# plt.pie([1, 2, 3, 4], labels=["A", "B", "C", "D"], autopct="%.2f%%")
# counterclock 是否逆时针绘制图形。默认为True。
# plt.pie([1, 2, 3, 4], labels=["A", "B", "C", "D"], counterclock=False)
# startangle 设置逆时针便宜x轴的角度。(默认为0),从哪里开始绘制图形。
# plt.pie([1, 2, 3, 4], labels=["A", "B", "C", "D"], startangle=90)
# shadow 是否含有阴影,默认为True。
plt.pie([1, 2, 3, 4], labels=["A", "B", "C", "D"], shadow=False)
散点图适合于用来显示与比较数据的分布状态。
说明:
# 散点图 / 气泡图体现的数据的分布状态。能够表现数据维度之间的关系。
# 散点图能够表示两个维度。气泡图可以表示2~4个维度(气泡的大小与气泡的颜色)
x = np.random.randint(0, 101, size=100)
y = np.random.randint(0, 101, size=100)
# s 点的大小,color:点的颜色。s与color可以统一设置,也可以为每一个点分别进行设置。
# plt.scatter(x, y, s=100, color="g")
size = np.random.randint(20, 100, size=100)
c=["r", "g", "b", "y"]
color = np.random.choice(c, 100)
plt.scatter(x, y, s=size, color=color)
直方图(histogram)可以看成是一种特殊的柱形图,用来将连续的数据频率(数量)进行离散化显示。在直方图中,数据被分割成若干区间,然后统计每个区间数据出现的频率(数量)。
我们可以通过plt.hist来绘制直方图。
# 直方图类似于柱形图,用来将连续值进行离散化的表示。
x = np.random.normal(scale=20, size=100)
# 如果没有指定划分的区间(段数),则默认为10。(区间长度是均匀划分【根据数值的取值范围划分】的。)
# plt.hist返回值:
# 第1个数组:每个桶(区间)中包含元素的数量。
# 第2个数组:我们划分的区间(元素数量是桶的数量+1。)
# 每个区间是前闭后开。但是,最后一个区间例外,最后一个区间是双闭的。
# plt.hist(x)
# 我们也可以显式指定桶的数量。
# plt.hist(x, bins=4)
# bins可以指定一个整数(int),此时表示桶数(划分的区间数),桶数是均匀划分的。我们也可以指定不
# 均匀的区间。(给bins传递一个数组)
plt.hist(x, bins=[-100, 10, 20, 25, 100])
箱线图也称盒须图。通过极值与Q1,Q2,Q3值来描述数据。通过箱线图,我们可以发现数据中的离群(异常)值。
箱线图的离群点定义为:Q3+1.5IQR和Q1-1.5IQR。其中IQR为两个四分位之间的距离。
# 箱线图用来检测离群点,离群点是可能潜在的异常值(并非一定是异常值)。
# IQR Q3与Q1之间的距离。
# 离群点: x > Q3 + 1.5IQR 或者 x < Q1 - 1.5IQR
x = [1, 3, 10, 15, 18, 20, 38]
plt.boxplot(x)
Series与DataFrame类型的对象也支持图形绘制,使用对象的plot方法即可。
如果我们需要绘制图形的数据就存在Series或者DataFrame对象中,我们就可以直接绘制,而无需使用plt.plot。
plot默认绘制的是线形图,我们可以通过调整其kind参数的值来绘制其他类型的图形。
参数:
说明:
plot(kind=“类型”)也可以通过plot."类型"来进行绘制。
import pandas as pd
# Series与DataFrame也支持绘制图形,只需要调用相关对象的plot方法即可。
s = pd.Series([1, 5, 20, 30], index=[2, 5, 8, 10])
# kind 来指定图像的类别,默认为线图。kind="line"
# s.plot(kind="line")
# s.plot(kind="area")
# s.plot(kind="kde")
df = pd.DataFrame([[1, 5, 10], [2, 8, 9], [3, 7, 6]], columns=["A", "B", "C"])
display(df)
# df.plot()
# 显示堆叠图,堆叠图更突出显示数据之间的比例。
# df.plot(kind="bar", stacked=True)
# df.plot(kind="box")
# 通过y参数指定绘制哪一列(列标签)。
# df.plot(kind="pie", y="A")
# 每一列都进行绘制。在子区域进行绘制。
df.plot(kind="pie", subplots=True)