Pyplot基本绘图

发布时间 2023-07-25 21:52:04作者: 贝壳里的星海

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()
img

标记大小与颜色

我们可以自定义标记的大小与颜色,使用的参数分别是:

  • 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()
img

文字说明

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()
img

有一种更加便捷的方式添加柱状图显示数据标签

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()
img

直方图

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()
img
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()
img

圆饼图

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()
img

散点图

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()
img
# 也是绘制散点图的方式

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);

颜色表

img

参考资料

https://www.cnblogs.com/marsggbo/p/15131773.html

https://zhuanlan.zhihu.com/p/136854657

https://mp.weixin.qq.com/s?__biz=MzIxNjM4NDE2MA==&mid=2247510349&idx=2&sn=ba8faa8b0396bbb698f1536b2924c42c&chksm=978b3e82a0fcb7944103cb3b08a312f26fd0157f43ab46ff61c86ac17a147b0d2e5f1532a3c4&cur_album_id=1296489767487553537&scene=189#rd