pyplot是Matplotlib的子库,提供了和Matlib类似的接口,能很方便用户绘制2D图表。
Pyplot 包含一系列绘图的相关函数,每个函数根据数据绘画出对应图像,也可以对当前的图像进行一些修改,例如:给图像加上标记,生新的图像,在图像中产生新的绘图区域等等。
首先使用import 导入pyplot库,并给出一个方便引用的别名plt.
import matplotlib.pyplot as plt
常用的绘图函数包括:
plot()
:用于绘制线图和散点图scatter()
:用于绘制散点图bar()
:用于绘制垂直条形图和水平条形图hist()
:用于绘制直方图pie()
:用于绘制饼图
除了这些基本的函数,pyplot 还提供了很多其他的函数,例如用于设置图表属性的函数、用于添加文本和注释的函数、用于保存图表到文件的函数等等。
在画图过程中报错,如AttributeError: module 'backend_interagg' has no attribute 'FigureCanvas'
导入
import matplotlib
matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置
import matplotlib.pyplot as plt
画图可能出现中文乱码
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams.update({'font.size': 20})
1.直线,折线,曲线,散点图
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.array([0, 7])
ypoints = np.array([0, 60])
plt.plot(xpoints, ypoints)
plt.show()
如果只想绘制两个坐标点,可以使用 o 参数,表示一个实心圈的标记。
即用plt.plot(xpoints, ypoints, 'o')替换plt.plot(xpoints, ypoints)
如果绘制一条不规则线,坐标为 (1, 6) 、 (2, 3) 、(4, 7) 、(5, 0),对应的两个数组为:[1, 2, 3, 4] 与 [6, 3, 7, 0]。
x = np.array([1, 2, 3, 4])
y = np.array( [6, 3, 7, 0])
plt.plot(x, y,linestyle='--',marker='o')#‘--’表示虚线 绘图标记 marker='o'
plt.show()
标记符号描述"."
点","
像素点"o"
实心圆"v"
下三角"^"
上三角"<"
左三角">"
右三角"1"
下三叉"2"
上三叉"3"
左三叉"4"
右三叉"8"
八角形"s"
正方形"p"
五边形"P"
加号(填充)""
星号"h"
六边形 1"H"
六边形 2"+"
加号"x"
乘号 x"X"
乘号 x (填充)"D"
菱形"d"
瘦菱形"|"
竖线"_"
横线0 (TICKLEFT)
左横线1 (TICKRIGHT)
右横线2 (TICKUP)
上竖线3 (TICKDOWN)
下竖线4 (CARETLEFT)
左箭头5 (CARETRIGHT)
右箭头6 (CARETUP)
上箭头7 (CARETDOWN)
下箭头8 (CARETLEFTBASE)
左箭头 (中间点为基准)9 (CARETRIGHTBASE)
右箭头 (中间点为基准)10 (CARETUPBASE)
上箭头 (中间点为基准)11 (CARETDOWNBASE)
下箭头 (中间点为基准)"None", " " or ""没有任何标记'$...$'
渲染指定的字符。例如 "$f$" 以字母 f 为标记。
绘制一个正弦和余弦图,在 plt.plot() 参数中包含两对 x,y 值,第一对是* x,y**,这对应于正弦函数,第二对是 x,z,这对应于余弦函数。
x1 = np.linspace(0, 15, 100)
y1 = np.sin(x1)
y2 = np.cos(x1)
plt.plot(x1, y1, color="blue", linewidth=2,linestyle='--')
plt.plot(x1, y2, color="red", linewidth=2,linestyle='-.')
linestyle的类型: '-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'
网格线
x = np.array([1, 2, 3, 4])
y = np.array( [6, 3, 7, 0])
plt.title("X-Y")#标题
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.plot(x, y,linestyle='--',marker='o',color='green')#‘--’表示虚线
plt.grid(color = 'r', linestyle = '-.', linewidth = 0.5)
plt.show()
Matplotlib 绘制多图
subplot(nrows, ncols, index, **kwargs) 图的个数=nrows* ncols 当前为index图。
import matplotlib
matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams.update({'font.size': 10})
#plot 1:
x = np.array([1, 2, 3, 4])
y = np.array( [6, 3, 7, 0])
plt.subplot(1, 2, 1)
plt.title("X-Y")
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.plot(x, y,linestyle='--',marker='o',color='green')#‘--’表示虚线
plt.grid(color = 'r', linestyle = '-.', linewidth = 0.5)
plt.title("plot 1")
#plot 2:
x1 = np.linspace(0, 15, 100)
y1 = np.sin(x1)
y2 = np.cos(x1)
plt.subplot(1, 2, 2)
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.plot(x1, y1, color="blue", linewidth=2,linestyle='--')
plt.plot(x1, y2, color="red", linewidth=2,linestyle='dashdot')
plt.title("plot 2")
plt.suptitle("RUNOOB subplot Test")
plt.show()
散点图
plt.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
x,y为输入数据,
s为散点的大小,
c颜色,
marker同上讲解,
norm数据颜色亮度(0,1)
, vmin=None, vmax=None数据亮度设置,norm存在时,忽略
alpha::透明度设置,0-1 之间,默认 None,即不透明。
linewidths:标记点的长度。
edgecolors::颜色或颜色序列,默认为 'face',可选值有 'face', 'none', None。
plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
import matplotlib
matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams.update({'font.size': 10})
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18,12,23,14,15,1, 23, 21,11,6, 13,3])
sizes = np.array([20,50,100,200,500,1000,60,90,20,50,100,200,500,1000,60,90,100,200,500])
colors = np.array(["red","green","black","orange","purple","beige","cyan","magenta","red","green","black","orange"
,"purple","beige","cyan","magenta","purple","beige","cyan"])
plt.title("RUNOOB Scatter Test")
plt.scatter(x, y,s=sizes,c=colors,alpha=0.4)
plt.show()
除了手动设置颜色,还可以通过颜色带设置,设置颜色条需要使用 cmap 参数,默认值为 'viridis',之后颜色值设置为 0 到 100 的数组。
import matplotlib
matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams.update({'font.size': 10})
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18,12,23,14,15,1, 23, 21,11,6, 13,3])
sizes = np.array([20,50,100,200,500,1000,60,90,20,50,100,200,500,1000,60,90,100,200,500])
colors = np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,60,70,75,80,90,100])
plt.scatter(x, y, c=colors, cmap='afmhot_r',s=sizes,alpha=0.6)
plt.colorbar()#显示颜色条
plt.show()
其他的颜色带自查,举个栗子:
BluesBlues_rGreensGreens_rRedsReds_r
2.柱状图
plt.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
x:浮点型数组,柱形图的 x 轴数据。
height:浮点型数组,柱形图的高度。
width:浮点型数组,柱形图的宽度。
bottom:浮点型数组,底座的 y 坐标,默认 0。
align:柱形图与 x 坐标的对齐方式,'center' 以 x 位置为中心,默认值。 'edge':将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align='edge'。
**kwargs::其他参数。
import matplotlib
matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams.update({'font.size': 10})
import matplotlib.pyplot as plt
import numpy as np
x = np.array(["bar-1", "bar-2", "bar-3", "bar-4"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, width=0.5,color = ["#4C5050","red","pink","#688B2F"],align='edge')
plt.show()
只要将plt.bar()改成plt.barh(),width改成height即可。
3.饼图
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)[source]
- x:浮点型数组或列表,用来绘制饼图的数据,表示每个扇形的面积。
- explode:数组,表示各个扇形之间的间隔,默认值为0。
- labels:列表,各个扇形的标签,默认值为 None。
- colors:数组,表示各个扇形的颜色,默认值为 None。
- autopct:设置饼图内各个扇形百分比显示格式,**%d%%** 整数百分比,**%0.1f** 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
- labeldistance:标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。
- pctdistance::类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
- shadow::布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
- radius::设置饼图的半径,默认为 1。
- startangle::用于指定饼图的起始角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。
- counterclock:布尔值,用于指定是否逆时针绘制扇形
- 默认为 True,即逆时针绘制,False 为顺时针。
- wedgeprops :字典类型,默认值 None。用于指定扇形的属性,比如边框线颜色、边框线宽度等。例如:wedgeprops={'linewidth':5} 设置 wedge 线宽为5。
- textprops :字典类型,用于指定文本标签的属性,比如字体大小、字体颜色等,默认值为 None。
- center :浮点类型的列表,用于指定饼图的中心位置,默认值:(0,0)。
- frame :布尔类型,用于指定是否绘制饼图的边框,默认值:False。如果是 True,绘制带有表的轴框架。
- rotatelabels :布尔类型,用于指定是否旋转文本标签,默认为 False。如果为 True,旋转每个 label 到指定的角度。
- data:用于指定数据。如果设置了 data 参数,则可以直接使用数据框中的列作为 x、labels 等参数的值,无需再次传递。
import matplotlibmatplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falseplt.rcParams.update({'font.size': 10})y = np.array([35, 25, 25, 15])plt.pie(y, labels=['A','B','C','D'], # 设置饼图标签 colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色 explode=(0, 0.2, 0, 0), # 第二部分突出显示,值越大,距离中心越远 autopct='%.2f%%', # 格式化输出百分比 shadow=True, #阴影 startangle=90 )plt.title("Pie Test")plt.show()
4.双纵轴图
fig, ax1 =plt.subplots() #####这句
plt.title("数据期间cart,fav,buy行为汇总分布")
ax1.plot(x, groupby_pv,linestyle='-',marker='o',color='red',label='pv')
ax1.set_ylabel('pv')
ax1.legend()
ax2 = ax1.twinx() # twinx将ax1的X轴共用与ax2,这步很重要
ax2.plot(x, groupby_cart,linestyle='-',marker='1',color='yellow',label="cart")
ax2.plot(x, groupby_fav,linestyle='-.',marker='2',color='blue',label='fav')
ax2.plot(x, groupby_buy,linestyle='solid',marker='3',color='pink',label='buy')
ax2.set_ylabel('cart,fav,buy')
# 添加图例
ax2.legend()
plt.show()
fig, ax1 = plt.subplots()
plt.xticks(rotation=45)
ax1.bar(x, groupby_pv, color="blue", alpha=0.5, label="pv")
ax1.set_xlabel("月份")
ax1.set_ylabel("pv次数")
ax2 = ax1.twinx()
ax2.plot(x, groupby_fav,linestyle='-.',marker='2',color='blue',label='fav')
ax2.plot(x, groupby_buy,linestyle='solid',marker='3',color='pink',label='buy')
ax2.set_ylabel('cart,fav,buy')
fig.legend(loc="upper right", bbox_to_anchor=(1, 1), bbox_transform=ax1.transAxes)
plt.show()
5.直方图
plt.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs)
x
:绘制直方图的数据,一个一维数组或列表。bins
:可选参数,表示直方图的箱数。默认为10。range
:表示直方图的值域范围,可以是一个二元组或列表。默认为None,即使用数据中的最小值和最大值。density
:表示是否将直方图归一化。默认为False,即直方图的高度为每个箱子内的样本数,而不是频率或概率密度。weights
:表示每个数据点的权重。默认为None。cumulative
:表示是否绘制累积分布图。默认为False。bottom
:表示直方图的起始高度。默认为None。histtype
:表示直方图的类型,可以是'bar'、'barstacked'、'step'、'stepfilled'等。默认为'bar'。align
:表示直方图箱子的对齐方式,可以是'left'、'mid'、'right'。默认为'mid'。orientation
:表示直方图的方向,可以是'vertical'、'horizontal'。默认为'vertical'。rwidth
:表示每个箱子的宽度。默认为None。log
:表示是否在y轴上使用对数刻度。默认为False。color
:表示直方图的颜色。label
:表示直方图的标签。stacked
:表示是否堆叠不同的直方图。默认为False。**kwargs
:可选参数,表示其他绘图参数import matplotlibmatplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falseplt.rcParams.update({'font.size': 10})import matplotlib.pyplot as pltimport numpy as np# 生成一组随机数据data = np.random.randn(100)# 绘制直方图plt.hist(data, bins=10, width=0.5,color='blue', alpha=0.8)# 设置图表属性plt.title('hist() Test')plt.xlabel('Value')plt.ylabel('Frequency')# 显示图表plt.show()
版权归原作者 qq_57867224 所有, 如有侵权,请联系我们删除。