Pyplot基本绘图
Pyplot基本绘图
Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。
Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改
plot()
:用于绘制线图和散点图scatter()
:用于绘制散点图bar()
:用于绘制垂直条形图和水平条形图hist()
:用于绘制直方图pie()
:用于绘制饼图imshow()
:用于绘制图像subplots()
:用于创建子图
折线图
matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
pyplot.plot(x,y,format_string)
format_string:主要来控制我们画的曲线的格式:颜色,风格,标记 color,marker,linestyle
x,y 表示 x 轴与 y 轴对应的数据
color 表示折线的颜色
marker 表示折线上数据点处的类型
linestyle 表示折线的类型
linewidth 线条粗细:linewidth=1.=5.=0.3
alpha 表示点的透明度
label 数据图例内容:label=‘实际数据’
import matplotlib.pyplot as plt
import numpy as np
# 生成一些随机数据
x = np.arange(0, 10, 0.1)
y = np.sin(x)
# 使用plot函数绘制图像
plt.plot(x, y, 'r') # 'r' 表示使用红色作为折线的颜色
# 添加图像标题和坐标轴标签
# 使用 plt.xlim()和plt.ylim()函数可以调整坐标轴
plt.xlim(0, 10)
plt.ylim(-1, 1)
plt.title('Sin Curve') # 标题
plt.xlabel('X') # 坐标轴说明
plt.ylabel('Y') # 坐标轴说明
# 显示图像
plt.show()
标记大小与颜色
我们可以自定义标记的大小与颜色,使用的参数分别是:
- markersize,简写为 ms:定义标记的大小。
- markerfacecolor,简写为 mfc:定义标记内部的颜色。
- markeredgecolor,简写为 mec:定义标记边框的颜色。
- markeredgewidth, 定义标记边框宽度
参考资料:https://www.runoob.com/matplotlib/matplotlib-marker.html
linestyle 折线的类型
'-' solid line style 实线
'--' dashed line style 虚线
'-.' dash-dot line style 虚点线
':' dotted line style 点线
标记字符 | 说明 | 标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|---|---|
' . ' | 点标记 | ' 1 ' | 下花三角 | ' h ' | 竖六边形 |
' , ' | 像素标记 | ' 2 ' | 上花三角 | ' H ' | 横六边形 |
' o ' | 实心圆 | ' 3 ' | 左花三角 | ' + ' | 十字标记 |
' v ' | 倒三角 | ' 4 ' | 右花三角 | ' x ' | x标记 |
' ^ ' | 上三角 | ' s ' | 实心方形 | ' D ' | 菱形标记 |
' > ' | 右三角 | ' p ' | 实心五角 | ' d ' | 菱形标记 |
' < ' | 左三角 | ' * ' | 星形标记 | ' | ' | 直线标记 |
标题与标签的定位
title() 方法提供了 loc 参数来设置标题显示的位置,可以设置为: 'left', 'right', 和 'center', 默认值为 'center'。
xlabel() 方法提供了 loc 参数来设置 x 轴显示的位置,可以设置为: 'left', 'right', 和 'center', 默认值为 'center'。
ylabel() 方法提供了 loc 参数来设置 y 轴显示的位置,可以设置为: 'bottom', 'top', 和 'center', 默认值为 'center'。
使用plt.xlim()和plt.ylim()函数可以调整坐标轴
x = np.linspace(0, 10, 1000)
plt.plot(x, np.sin(x))
plt.xlim(-1, 11)
plt.ylim(-1.5, 1.5);
网格线
matplotlib.pyplot.grid(b=None, which='major', axis='both', )
color = 'color', linestyle = 'linestyle', linewidth = number
b: 可选,默认为 None,可以设置布尔值,true 为显示网格线,false 为不显示,如果设置 **kwargs 参数,则值为 true。
which: 可选,可选值有 'major'、'minor' 和 'both',默认为 'major',表示应用更改的网格线。
axis: 可选,设置显示哪个方向的网格线,可以是取 'both'(默认),'x' 或 'y',分别表示两个方向,x 轴方向或 y 轴方向。
**kwargs: 可选,设置网格样式,可以是 color='r', linestyle='-' 和 linewidth=2,分别表示网格线的颜色,样式和宽度
color: 'b' 蓝色,'m' 洋红色,'g' 绿色,'y' 黄色,'r' 红色,'k' 黑色,'w' 白色,'c' 青绿色,'#008000' RGB 颜色符串。
linestyle: '‐' 实线,'‐‐' 破折线,'‐.' 点划线,':' 虚线。
linewidth: 设置线的宽度,可以设置一个数字
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.plot(x, y , c = '#8FBC8F',marker = 'o', ms = 10, mfc = 'r')
plt.title("matplotlib Test")
plt.xlabel("x - label",loc="left")
plt.ylabel("y - label", loc="top")
plt.grid(color = 'b', linestyle = '--', linewidth = 0.5)
plt.show()
文字说明
plt.text或ax.text函数来实现 在指定位置添加标签
plt.text(x, y, string, fontsize=15,verticalalignment="top",horizontalalignment="right")
x,y: 表示坐标值上的值
string: 表示说明文字
fontsize: 表示字体大小
verticalalignment: 垂直对齐方式 ,参数:[ ‘center’ | ‘top’ | ‘bottom’ | ‘baseline’ ]
horizontalalignment:水平对齐方式 ,参数:[ ‘center’ | ‘right’ | ‘left’ ]
xycoords 选择指定的坐标轴系统:
import numpy as np
import matplotlib.pyplot as plt
# 设置画布颜色为 blue
plt.style.use("seaborn-v0_8-whitegrid")
fig, ax = plt.subplots()
# y 轴数据
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
X = np.arange(4)
width=0.25
plt.bar(X+width*0, data[0], color = 'darkorange', width = width,label = 'A')
plt.bar(X+width*1, data[1], color = 'steelblue', width =width,label="B")
plt.bar(X+width*2, data[2], color = 'violet', width = width,label = 'C')
# 添加文字描述
W = [width*0,width*1,width*2]# 偏移量
for i in range(3):
for a,b in zip(X+W[i],data[i]):#zip拆包
plt.text(a,b,"%.0f"% b,ha="center",va= "bottom")#格式化字符串,保留0位小数
plt.xlabel("Group")
plt.ylabel("Num")
# 在(0,48)这个位置,显示note 这个值
plt.text(1,48,"note",fontsize=15, ha='left', rotation=15, wrap=True)
# family参数是一个字体参数
plt.text(1.5,32,"deep",fontsize=15, ha='left', rotation=15, wrap=True,
bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k',lw=1 ,alpha=0.5))
plt.legend()
plt.show()
有一种更加便捷的方式添加柱状图显示数据标签
plt.bar_label(container,labels=None,*,fmt='%g',label_type='edge',padding=0,**kwargs,)
container: bar或barh函数返回值
labels : 标签文本列表,默认为None,即为使用fmt参数格式化的柱子的数据
fmt: 标签的格式字符串,默认值为'%g',即将标签值格式化为浮点数
label_type :标签类型,可选参数为'edge', 'center',默认值为'edge'。对于普通柱状图,该参数仅用于控制标签的位置;对于堆积柱状图,不同标签类型对应不同的标签值:'edge': 标签位于柱子的端点, 'center':标签位于柱子的中部
padding : 标签与柱子之间的距离,单位为像素,默认值为0
import numpy as np
import matplotlib.pyplot as plt
# 设置画布颜色为 blue
plt.style.use("seaborn-v0_8-whitegrid")
fig, ax = plt.subplots()
# y 轴数据
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
X = np.arange(4)
width=0.25
cm1=plt.bar(X+width*0, data[0], color = 'darkorange', width = width,label = 'A')
cm2=plt.bar(X+width*1, data[1], color = 'steelblue', width =width,label="B")
cm3=plt.bar(X+width*2, data[2], color = 'violet', width = width,label = 'C')
# # 添加文字描述
# W = [width*0,width*1,width*2]# 偏移量
# for i in range(3):
# for a,b in zip(X+W[i],data[i]):#zip拆包
# plt.text(a,b,"%.0f"% b,ha="center",va= "bottom")#格式化字符串,保留0位小数
plt.bar_label(cm1, label_type='edge')
plt.bar_label(cm2, label_type='edge')
plt.bar_label(cm3, label_type='edge')
plt.xlabel("Group")
plt.ylabel("Num")
# 在(0,48)这个位置,显示note 这个值
plt.text(1,48,"note",fontsize=15, ha='left', rotation=15, wrap=True)
# family参数是一个字体参数
plt.text(1.5,32,"deep",fontsize=15, ha='left', rotation=15, wrap=True,
bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k',lw=1 ,alpha=0.5))
plt.legend()
plt.show()
柱形图
matplotlib.pyplot.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.pyplot as plt
import numpy as np
x = np.array(["go", "python", "java", "rust"])
y = np.array([12, 22, 6, 18])
# plt.bar(x, y, width = 0.5, color = ["#4CAF50","red","hotpink","#556B2F"])
plt.barh(x, y, height = 0.6,color = ["#4CAF50","red","hotpink","#556B2F"])
plt.show()
直方图
matplotlib.pyplot.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: 可选参数,表数据的值域,即数据的取值范围,默认值为 (x.min(), x.max()) 。
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 matplotlib.pyplot as plt
import numpy as np
# 生成一组随机数据
data = np.random.randn(10000)
# 绘制直方图
plt.hist(data, bins=100, color='g', density=False)
# 设置图形标题和坐标轴标签
plt.title('Histogram')
plt.xlabel('Value')
plt.ylabel('Frequency')
# 显示图形
plt.show()
import matplotlib.pyplot as plt
import numpy as np
# 生成三组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 1000)
data3 = np.random.normal(-2, 1, 1000)
# 绘制直方图
plt.hist(data1, bins=30, alpha=0.5, label='Data 1')
plt.hist(data2, bins=30, alpha=0.5, label='Data 2')
plt.hist(data3, bins=30, alpha=0.5, label='Data 3')
# 设置图表属性
plt.title('matplotlib hist() ')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.grid()
plt.legend()
# 显示图表
plt.show()
圆饼图
matplotlib.pyplot.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 matplotlib.pyplot as plt
import numpy as np
y = np.array([35, 25, 25, 15])
labels=['A','B','C','D']
# 突出显示第二个扇形
explode = (0, 0.1, 0, 0)
shadow=True # 设置饼图的阴影
radius=1 # 设置半径为5
autopct='%1.1f%%' # %0.1f%% 一位小数 ,%0.1f 一位小数
plt.pie(y,explode=explode, labels=labels,radius=radius,shadow=shadow,autopct=autopct, startangle=15)
# startangle=15 从x轴,逆时针方向转15度
plt.title("matplotlib Pie") # 设置标题
plt.show()
散点图
matplotlib.pyplot.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: 点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
c: 点的颜色,默认蓝色 'b',也可以是个 RGB 或 RGBA 二维行数组。
marker: 点的样式,默认小圆圈 'o'。
cmap: Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。
norm: Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。
vmin,vmax:亮度设置,在 norm 参数存在时会忽略。
alpha: 透明度设置,0-1 之间,默认 None,即不透明。
linewidths:标记点的长度。
edgecolors:颜色或颜色序列,默认为 'face',可选值有 'face', 'none', None。
plotnonfinite:布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
**kwargs: 其他参数。
import numpy as np
import matplotlib.pyplot as plt
# 随机数生成器的种子
np.random.seed(2)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2 # 0 to 15 point radii
plt.scatter(x, y, s=area, c=colors, alpha=0.5) # 设置颜色及透明度
plt.title("matplotlib Scatter ") # 设置标题
plt.colorbar()
plt.show()
# 也是绘制散点图的方式
rng = np.random.RandomState(0)
for marker in ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd']:
plt.plot(rng.rand(5), rng.rand(5), marker,
label="marker='{0}'".format(marker))
plt.legend(numpoints=1)
plt.xlim(0, 1.8);