散点图
plt.scatter(x,y,
s, # 点大小
c, # 点颜色
linewidth, # 线宽
marker # 点的形状
)
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 2.0*np.pi, 0.1) #x轴数据
y = np.sin(x) #y轴数据
plt.scatter(x, #x轴坐标
y, #y轴坐标
s= np.abs(y)*50 , #散点大小 #散点大小与位置有关
linewidths=1, #线宽
c = 'r', #颜色
marker='*') #散点符号
plt.show()
柱状图(误差棒)
matplotlib之pyplot模块之柱状图(bar():基础参数、外观参数)_plt.bar_mighty13的博客-CSDN博客
bar()的基础参数如下:
x:柱子在x轴上的坐标。浮点数或类数组结构。注意x可以为字符串数组!
height:柱子的高度,即y轴上的坐标。浮点数或类数组结构。
width:柱子的宽度。浮点数或类数组结构。默认值为0.8。
bottom:柱子的基准高度。浮点数或类数组结构。默认值为0。
align:柱子在x轴上的对齐方式。字符串,取值范围为{'center', 'edge'},默认为'center'。
'center':x位于柱子的中心位置。
'edge':x位于柱子的左侧。如果想让x位于柱子右侧,需要同时设置负width 以及align='edge'。
MODELs | AUC | AUC(error误差) |
M1 | 0.856267473 | 0.042804689 |
M2 | 0.90337009 | 0.04444241 |
M3 | 0.930575381 | 0.043041211 |
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif'] = ['STKaiTi'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
data1 = pd.read_excel('C:\\Users\\ASUS\\Desktop\\data.xlsx', sheet_name='MOUSE') # AUC
data2 = pd.read_excel('C:\\Users\\ASUS\\Desktop\\data.xlsx', sheet_name='humanSTD') # AUC(误差)
# 数据
data = data1['AUC']
errors = data2['AUC']
labels = ['M1', 'M2', 'M3']
# 创建一个颜色列表,包含每个柱子对应的颜色
colors = ['skyblue', 'lightgreen', 'orange']
# 计算柱子的宽度,使它们没有间隙
bar_width = 1
# 创建直方图,并设置颜色
plt.figure(dpi=300)
plt.title('不同模型的AUC值')
# 绘制柱状图,并为每个数据系列设置legend,并带上误差棒
for i in range(len(data)):
plt.bar(labels[i], data[i], yerr=errors[i], capsize=5, width=bar_width, color=colors[i], label=f'M{i + 1}')
# 添加数据标签
for i in range(len(data)):
plt.text(labels[i], data[i] + 0.05, f'{data[i]:.3f}', ha='center')
# 添加标签和标题
plt.xlabel('模型')
plt.ylabel('AUC')
# 添加图例
plt.legend()
# 绘制散点图
for i in range(len(data)):
plt.scatter(labels[i], data[i], c="black", zorder=2)
# 取出上边框和右边框
ax = plt.gca()
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
# 显示图形
plt.show()
要求:1.画出三个模型的AUC柱状图 2.每个柱子上要有数据标签 3.每个柱子上要有代表误差的误差条 4.要取出表格的上边框和右边框 5.在柱状图中间画一个点
如果需要加上legend图例,由于我们是直接用plt.bar()画出3个柱子,所以无法加上图例。所以我们需要借助for循环依次画上柱子并打上标签
# 绘制柱状图,并为每个数据系列设置标签
for i in range(len(data)):
plt.bar(labels[i], data[i], yerr=errors[i], capsize=5, width=bar_width, color=colors[i], label=f'M{i + 1}')
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif'] = ['STKaiTi'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
data1 = pd.read_excel('C:\\Users\\ASUS\\Desktop\\data.xlsx', sheet_name='MOUSE')
data2 = pd.read_excel('C:\\Users\\ASUS\\Desktop\\data.xlsx', sheet_name='humanSTD')
# 数据
data = data1['AUC']
errors = data2['AUC']
labels = ['M1', 'M2', 'M3']
# 创建一个颜色列表,包含每个柱子对应的颜色
colors = ['skyblue', 'lightgreen', 'orange']
# 计算柱子的宽度,使它们没有间隙
bar_width = 1
# 创建直方图,并设置颜色
plt.figure(dpi=300)
plt.title('不同模型的AUC值')
# 绘制柱状图,并为每个数据系列设置标签
for i in range(len(data)):
plt.bar(labels[i], data[i], yerr=errors[i], capsize=5, width=bar_width, color=colors[i], label=f'M{i + 1}')
# 添加数据标签
for i in range(len(data)):
plt.text(labels[i], data[i] + 0.05, f'{data[i]:.3f}', ha='center')
# 添加标签和标题
plt.xlabel('模型')
plt.ylabel('AUC')
# 添加图例
plt.legend()
# 绘制散点图
for i in range(len(data)):
plt.scatter(labels[i], data[i], c="black", zorder=2)
# 取出上边框和右边框
ax = plt.gca()
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
# 显示图形
plt.show()
多类别柱状图
横向条形图
注意plt.barh的参数,y是y轴标签,width是对应数值
import matplotlib.pyplot as plt
plt.rcParams ['font.sans-serif'] = ['STKaiTi']
category = ['USD', 'Knowledge', 'Jobs', 'Kudos', 'Swag', 'EUR'][::-1]# 反转一下列表
num = [265, 17, 14, 6, 6, 1][::-1]
colors = ['skyblue', 'lightgreen', 'orange','gold','skyblue','coral','red']
plt.figure(dpi=250)
plt.title('各奖励种类数目')
# 绘制柱状图
for i in range(len(category)):
plt.barh(category[i], num[i], # 参数y = category[i],width = num[i]
capsize=5,height=0.5, color=colors[i], label=f'M{i + 1}')
# 绘制数字标签
for i in range(len(category)):
plt.text(num[i], i, f'{num[i]:d}',
ha='left', va='center')
# 删除某些坐标轴
plt.gca().spines['right'].set_visible(False) #设置坐标轴,下同
plt.gca().spines['bottom'].set_visible(False)
plt.subplots_adjust (left =0.1) #没必要:调整图表距左的空白
plt.gca().xaxis.set_ticks_position('top') # 将x轴坐标放到顶部
plt.grid(True,alpha = 0.1)
plt.show ()
花里胡哨的柱状图
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 11)
y = 11-x
#绘制柱状图
plt.bar(x,y,
color='#772277', #柱的颜色
alpha=0.5, #透明度
edgecolor='blue', #边框颜色,呈现描边效果
linestyle='--', #边框样式为虚线
linewidth=1, #边框线宽
hatch='/') #内部使用斜线填充
#为每个柱形添加文本标注
for xx, yy in zip(x,y):
plt.text(xx-0.2, yy+0.1, '%2d' % yy)
#显示图形
plt.show()
饼图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['STKaiTi'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.figure(num = 1,figsize = (10,10),dpi=200) # 设置画布
plt.title("饼图") # 设置画布标题
plt.pie(x = [20,30,10,50], # 数据
explode = (0,0.05,0,0) , # 指定饼图某些部分的突出显示,即呈现爆炸式
labels = ['A','B','C','D'], # 添加标签
colors = ['yellowgreen','gold','skyblue','coral'], #自定义颜色
shadow = True, # 阴影
autopct='%.2f%%', #设置百分比的格式,这里保留两位小数
pctdistance=0.8, #设置百分比标签与圆心的距离
labeldistance=0.5, #设置标签与圆心的距离
startangle=180, #设置饼图的初始角度
radius=0.8, #设置饼图的半径
counterclock=False, #是否逆时针,这里设置为顺时针方向
wedgeprops={'linewidth':1.5, 'edgecolor':'green'}, #设置饼图内外边界的属性值
textprops={'fontsize':15, 'color':'black'} #设置文本标签的属性值
)
plt.show()
折线图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['STKaiTi'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.figure(num = 1,dpi=300)
# 数据
X = [1,2,3,4,5,6,7] # 序号
y = [68,69,79,71,80,70,66] # 重量
plt.title('折线图')
# 画图
plt.plot(X, y,
color = 'b',linestyle ='--', marker='*',alpha=0.5, linewidth=1, label='训练')
'''
color:颜色;linestyle:线条种类(实线、虚线);marker:点的形状;
alpha:透明度;linewidth:线宽; label:这条线的图例标签
'''
# 标注
for i in range(len(X)):
plt.text(X[i], y[i]+0.1,
f'{y[i]:d}', ha='center', va='bottom', fontsize=7.5)
# 后续修饰
plt.xlabel('序号',fontsize = 15) #x轴的标签,即x代表的东西,在这里是序号
plt.ylabel('重量',fontsize = 15)#y轴的标签,即x代表的东西,在这里是重量
plt.xticks(fontsize = 12) # x轴刻度
plt.yticks(fontsize = 12) # y轴刻度
plt.legend() #显示图例,即上方的label
plt.show()
余弦函数
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['STKaiTi']
plt.rcParams['axes.unicode_minus'] = False
plt.title('sin-cos函数图像')
t = np.arange(0.0, 2*np.pi, 0.01) #自变量取值范围
s = np.sin(t) #计算正弦函数值
c = np.cos(t) #计算余弦函数值
plt.plot(t,s,label='正弦',color='red') #颜色
plt.plot(t,c, label='余弦', color='blue')
plt.xlabel('x-变量')
plt.ylabel('y-正弦余弦函数值')
plt.legend() #显示图例
plt.show() #显示绘制的结果图像
环形图
其实就是利用中心画一个白色的饼图,使得外面的饼图呈现一种环形的样子
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['STKaiTi']
plt.rcParams['axes.unicode_minus']=False
# 不同类型的占比
plt.figure(num = 1,dpi = 300)
plt.title('不同类型的占比')
valTrain = [1, 2, 3, 4]
valTest = [2, 3, 4, 5]
labelTrain = ['A', 'B', 'C']
labelTest = ['A', 'B', 'C']
colors = ['coral','gold','skyblue']
# 第一步:画出外部饼图。训练集
plt.pie(valTrain ,
# labels = labelTrain, # 标签,如果注释掉就不显示饼图文本标签
colors = colors,
autopct='%.2f%%', #设置百分比的格式,这里保留两位小数
pctdistance=0.9, #设置百分比标签与圆心的距离
labeldistance=0.8, #设置标签与圆心的距离
startangle=90, #设置饼图的初始角度
radius=1.2, #设置饼图的半径
counterclock=False, #是否逆时针,这里设置为顺时针方向
wedgeprops={'linewidth':1.5,'edgecolor': "w"}, #设置饼图内外边界的属性值
textprops={'fontsize':8, 'color':'black'} #设置文本标签的属性值
)
plt.legend(labels = labelTrain,loc = 'center') # 显示图例,在这里显示图例,后面的图例就不显示了
# 第二步:画出内部饼图。测试集
plt.pie(valTest,
#labels = labelTest, # 标签,如果注释掉就不显示饼图文本标签
colors = colors,
autopct='%.2f%%', #设置百分比的格式,这里保留两位小数
pctdistance=0.9, #设置百分比标签与圆心的距离
labeldistance=0.8, #设置标签与圆心的距离
startangle=90, #设置饼图的初始角度
radius=1, #设置饼图的半径
counterclock=False, #是否逆时针,这里设置为顺时针方向
wedgeprops={'linewidth':1.5,'edgecolor': "w"}, #设置饼图内外边界的属性值
textprops={'fontsize':8, 'color':'black'} #设置文本标签的属性值
)
# 第三步:画出中间的白色饼图,使饼图呈现环形图的样式
plt.pie([1], # 设置数据为[1]
colors = ['w'], # 白色的饼图
radius=0.8, #设置饼图的半径
)
plt.show()
子图
子图存在不同的画法
使用plt.subplot()划分出子图的区域
这里使用plt.subplot(1,2,1)相当于划分了一个属于该子图的区域,
import numpy as np
import matplotlib.pyplot as plt
plt.figure(dpi=300)
x= np.linspace(0, 2*np.pi, 500) #创建自变量数组
y1 = np.sin(x) #创建函数值数组
y2 = np.cos(x)
plt.subplot(1,2,1)
plt.plot(x, y1, color='red')
plt.subplot(1,2,2)
plt.plot(x, y2, color='blue')
这种主打一个简单方便,但是不便于对每个子图进行不同设置
fig.add_subplot()创建子图对象
使用这个能很方面地分别对子图进行详细设置
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(dpi=300)
fig.suptitle('子图')
# 添加子图对象
ax1 = fig.add_subplot(2,2,1,facecolor = 'pink') # 把绘图区域切分为两行两列,选择两行两列的第一个区域
ax2 = fig.add_subplot(2,2,2,facecolor = 'y') #选择两行两列的第二个区域
ax3 = fig.add_subplot(2,1,2,facecolor = 'skyblue') #把绘图区域切分为两行一列,选择两行一列的第二个区域
# 调节子图与画布标题之间的间距为0.9
# 调整子图之间的垂直间距为0.5
plt.subplots_adjust(top=0.9,hspace=0.5)
# 数据
x= np.linspace(0, 2*np.pi, 500) #创建自变量数组
y1 = np.sin(x) #创建函数值数组
y2 = np.cos(x)
y3 = np.tan(x)
# 子图1
ax1.set_title('正弦')
ax1.plot(x, y1, color='red',label ='$sin(x)$') # 设置图例显示公式
ax1.set_xlabel("x坐标")
ax1.set_ylabel("y坐标")
ax1.set_ylim(-1.2, 1.2)
ax1.legend(fontsize=5,loc = 'upper left')
# 子图2
ax2.set_title('余弦')
ax2.plot(x, y2, color='red',label ='$cos(x)$' )
ax2.set_ylim(-1.2, 1.2)
ax2.legend(fontsize=5,loc = 'upper left')
# 子图3
ax3.set_title('正切')
ax3.plot(x, y3, color='red',label='$tan(x)$')
ax3.set_ylim(-10, 10)
ax3.legend(fontsize=5,loc = 'upper left')
plt.show()
直方图
使用seaborn.histplot(data,kde = True),
kde = True:控制是否绘制核密度估计(Kernel Density Estimation,核密度估计)曲线,核密度估计是一种用于估计数据分布的平滑方法,它通过对数据进行平滑处理来生成一个连续的概率密度函数曲线。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
data = np.random.normal(loc=0, scale=1, size=1000)# 随机生成1000个服从正态分布的数据
# 使用Seaborn绘制直方图
sns.histplot(data, kde=True)
plt.title("直方图")
plt.xlabel("X轴")
plt.show()
热力图
相关系数热力图
首先计算出每个属性之间的相关系数df.corr(),使用sns.heatmap(df.corr(),annot=True)画出相关系数热力图
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams ['font.sans-serif'] = ['SimHei']
# 数据
data = {
'消费频率': [1, 1, 1, 1, 2, 1, 1, 1, 1, 1],
'最近消费时间间隔': [5.270231481, 41.35841435, 301.2756944, 39.5953125, 447.0455324, 710.4631829, 548.5095602, 3.467372685, 312.4875694, 283.4523727],
'消费金额': [14.9, 51.87, 178.68, 65.4, 411.5, 48.86, 81.75, 70.4, 22.39, 45.37]
}
df = pd.DataFrame(data)
corr = df.corr()
# 热力图
plt.figure(figsize=(10,10))
sns.heatmap(corr, annot=True, # 在每个热力图单元格中显示数值。
fmt='.3f', # 指定了显示数值的格式,保留3位小数
cmap='Blues', # 指定了用于着色的颜色映射,这里使用了蓝色调色板
xticklabels=['A','B','C'], yticklabels=['A','B','C'] # 用于指定x轴和y轴的标签
)
混淆矩阵热力图
原理是一样的
3D图
三维曲线
看不懂,了解一下,3D曲线就可以了
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams ['font.sans-serif'] = ['STKaiTi']
fig = plt.figure()
ax=plt.axes(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 200)
z = np.linspace(-4, 4, 200)*0.4 #创建模拟数据
r = z**3 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x,y,z,label='三维曲线')
ax.legend() #显示图例
plt.show() #显示绘制结果
3D曲面图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # 使用Matplotlib的mpl_toolkits.mplot3d库来创建一个3D坐标轴对象
# 生成数据
x = np.linspace(0, 4, 1000)
y = np.linspace(0, 4, 1000)
x1, y1 = np.meshgrid(x, y)
x2 = x1.flatten()
y2 = y1.flatten()
xy = np.vstack([x2, y2])
zxy = lambda t: np.exp(t[0]) *t[1]
z = zxy(xy)
plt.figure(dpi=300)
ax = plt.axes( projection='3d') # 创建3D坐标轴对象
ax.plot_surface(x1, y1, z.reshape(x1.shape), cmap='viridis') # 绘制3D曲面图
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D曲面图')
plt.show()
关于meshgrid的用法可以看这个http://t.csdnimg.cn/OIby1
三维柱状图
# 绘制三维柱状图
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randint(0, 40, 10) #创建测试数据
y = np.random.randint(0, 40, 10)
z = 80*abs(np.sin(x+y))
plt.figure(dpi = 300)
ax = plt.subplot(projection='3d') #绘制三维图形
ax.bar3d(x, #设置x轴数据
y, #设置y轴数据
np.zeros_like(z), #设置柱的z轴起始坐标为0
dx=5, #x方向的宽度
dy=5, #y方向的厚度
dz=z, #z方向的高度
color='red') #设置面片颜色为红色
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
雷达图
可以说几乎用不到,这里只是写一下
要注意收尾相接
# 例7 绘制雷达图。
import numpy as np
import matplotlib.pyplot as plt
labels = np.array(list('abcdefghij')) #设置标签
data = np.array([11,4]*5) #创建模拟数据array([11, 4, 11, 4, 11, 4, 11, 4, 11, 4])
dataLength = len(labels) #数据长度
#angles数组把圆周等分为dataLength份
angles = np.linspace(0, #数组第一个数据
2*np.pi, #数组最后一个数据
dataLength, #数组中数据数量
endpoint=False) #不包含终点
#首尾相接,使得曲线闭合
data = np.append(data, data[0])
angles = np.append(angles, angles[0])
labels = np.append(labels, labels[0])
plt.polar(angles, #设置角度
data, #设置各角度上的数据
'rv--', #设置颜色、线型和端点符号
linewidth=2) #设置线宽
#设置角度网格标签
plt.thetagrids(angles*180/np.pi, #角度
labels) #标签
#设置填充色
plt.fill(angles, #设置角度
data, #设置各角度上的数据
facecolor='r', #设置填充色
alpha=0.6) #设置透明度
plt.ylim(0,12) #设置坐标跨度
plt.show() #显示绘图结果
图例legend设置
总的来说,挺牛逼哄哄的,让我写写不出来。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams ['font.sans-serif'] = ['STKaiTi']
t = np.arange(0.0, 2*np.pi, 0.01)
s = np.sin(t)
c = np.cos(t)
plt.figure(dpi=300)
plt.plot(t, s, label='正弦')
plt.plot(t, c, label='余弦')
plt.title('sin-cos函数图像')
plt.legend(title='Legend', #设置图例标题
loc='lower left', #设置图例参考位置
bbox_to_anchor=(0.43,0.75),#设置图例位置偏移量
shadow=True, #显示阴影
facecolor='yellowgreen', #设置图例背景色
edgecolor='red', #设置图例边框颜色
ncol=2, #显示为两列
markerfirst=False) #设置图例文字在前,符号在后
plt.show()