【python】可视化绘图

散点图

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'。

MODELsAUCAUC(error误差)
M10.8562674730.042804689
M20.903370090.04444241
M30.9305753810.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()

折线图

参考:http://t.csdnimg.cn/yCWRT

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值