• 【python】可视化


    散点图

    plt.scatter(x,y,

                    s, # 点大小

                    c,  # 点颜色

                    linewidth,  # 线宽

                    marker  # 点的形状

    )

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. x = np.arange(0, 2.0*np.pi, 0.1) #x轴数据
    4. y = np.sin(x) #y轴数据
    5. plt.scatter(x, #x轴坐标
    6. y, #y轴坐标
    7. s= np.abs(y)*50 , #散点大小 #散点大小与位置有关
    8. linewidths=1, #线宽
    9. c = 'r', #颜色
    10. marker='*') #散点符号
    11. 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
    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. import pandas as pd
    4. plt.rcParams['font.sans-serif'] = ['STKaiTi'] # 用来正常显示中文标签
    5. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
    6. data1 = pd.read_excel('C:\\Users\\ASUS\\Desktop\\data.xlsx', sheet_name='MOUSE') # AUC
    7. data2 = pd.read_excel('C:\\Users\\ASUS\\Desktop\\data.xlsx', sheet_name='humanSTD') # AUC(误差)
    8. # 数据
    9. data = data1['AUC']
    10. errors = data2['AUC']
    11. labels = ['M1', 'M2', 'M3']
    12. # 创建一个颜色列表,包含每个柱子对应的颜色
    13. colors = ['skyblue', 'lightgreen', 'orange']
    14. # 计算柱子的宽度,使它们没有间隙
    15. bar_width = 1
    16. # 创建直方图,并设置颜色
    17. plt.figure(dpi=300)
    18. plt.title('不同模型的AUC值')
    19. # 绘制柱状图,并为每个数据系列设置legend,并带上误差棒
    20. for i in range(len(data)):
    21. plt.bar(labels[i], data[i], yerr=errors[i], capsize=5, width=bar_width, color=colors[i], label=f'M{i + 1}')
    22. # 添加数据标签
    23. for i in range(len(data)):
    24. plt.text(labels[i], data[i] + 0.05, f'{data[i]:.3f}', ha='center')
    25. # 添加标签和标题
    26. plt.xlabel('模型')
    27. plt.ylabel('AUC')
    28. # 添加图例
    29. plt.legend()
    30. # 绘制散点图
    31. for i in range(len(data)):
    32. plt.scatter(labels[i], data[i], c="black", zorder=2)
    33. # 取出上边框和右边框
    34. ax = plt.gca()
    35. ax.spines['right'].set_visible(False)
    36. ax.spines['top'].set_visible(False)
    37. # 显示图形
    38. 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}')

    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. import pandas as pd
    4. plt.rcParams['font.sans-serif'] = ['STKaiTi'] # 用来正常显示中文标签
    5. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
    6. data1 = pd.read_excel('C:\\Users\\ASUS\\Desktop\\data.xlsx', sheet_name='MOUSE')
    7. data2 = pd.read_excel('C:\\Users\\ASUS\\Desktop\\data.xlsx', sheet_name='humanSTD')
    8. # 数据
    9. data = data1['AUC']
    10. errors = data2['AUC']
    11. labels = ['M1', 'M2', 'M3']
    12. # 创建一个颜色列表,包含每个柱子对应的颜色
    13. colors = ['skyblue', 'lightgreen', 'orange']
    14. # 计算柱子的宽度,使它们没有间隙
    15. bar_width = 1
    16. # 创建直方图,并设置颜色
    17. plt.figure(dpi=300)
    18. plt.title('不同模型的AUC值')
    19. # 绘制柱状图,并为每个数据系列设置标签
    20. for i in range(len(data)):
    21. plt.bar(labels[i], data[i], yerr=errors[i], capsize=5, width=bar_width, color=colors[i], label=f'M{i + 1}')
    22. # 添加数据标签
    23. for i in range(len(data)):
    24. plt.text(labels[i], data[i] + 0.05, f'{data[i]:.3f}', ha='center')
    25. # 添加标签和标题
    26. plt.xlabel('模型')
    27. plt.ylabel('AUC')
    28. # 添加图例
    29. plt.legend()
    30. # 绘制散点图
    31. for i in range(len(data)):
    32. plt.scatter(labels[i], data[i], c="black", zorder=2)
    33. # 取出上边框和右边框
    34. ax = plt.gca()
    35. ax.spines['right'].set_visible(False)
    36. ax.spines['top'].set_visible(False)
    37. # 显示图形
    38. plt.show()

    多类别柱状图

    横向条形图

    注意plt.barh的参数,y是y轴标签,width是对应数值

    1. import matplotlib.pyplot as plt
    2. plt.rcParams ['font.sans-serif'] = ['STKaiTi']
    3. y = ['烘焙', '家电', '水产']
    4. num = [7.496, 61.0, 135.38]
    5. plt.figure(dpi=300)
    6. plt.barh(y =y,width = num,height=0.5,color ='dodgerblue')
    7. plt.subplots_adjust (left =0.2) #调整图表距左的空白
    8. plt.tick_params(bottom= True,left= False) #坐标轴刻度线是否显示
    9. plt.show ()

    花里胡哨的柱状图 

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. x = np.linspace(0, 10, 11)
    4. y = 11-x
    5. #绘制柱状图
    6. plt.bar(x,y,
    7. color='#772277', #柱的颜色
    8. alpha=0.5, #透明度
    9. edgecolor='blue', #边框颜色,呈现描边效果
    10. linestyle='--', #边框样式为虚线
    11. linewidth=1, #边框线宽
    12. hatch='/') #内部使用斜线填充
    13. #为每个柱形添加文本标注
    14. for xx, yy in zip(x,y):
    15. plt.text(xx-0.2, yy+0.1, '%2d' % yy)
    16. #显示图形
    17. plt.show()

    饼图 

    1. import matplotlib.pyplot as plt
    2. plt.rcParams['font.sans-serif']=['STKaiTi'] #用来正常显示中文标签
    3. plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
    4. plt.figure(num = 1,figsize = (10,10),dpi=200) # 设置画布
    5. plt.title("饼图") # 设置画布标题
    6. plt.pie(x = [20,30,10,50], # 数据
    7. explode = (0,0.05,0,0) , # 指定饼图某些部分的突出显示,即呈现爆炸式
    8. labels = ['A','B','C','D'], # 添加标签
    9. colors = ['yellowgreen','gold','skyblue','coral'], #自定义颜色
    10. shadow = True, # 阴影
    11. autopct='%.2f%%', #设置百分比的格式,这里保留两位小数
    12. pctdistance=0.8, #设置百分比标签与圆心的距离
    13. labeldistance=0.5, #设置标签与圆心的距离
    14. startangle=180, #设置饼图的初始角度
    15. radius=0.8, #设置饼图的半径
    16. counterclock=False, #是否逆时针,这里设置为顺时针方向
    17. wedgeprops={'linewidth':1.5, 'edgecolor':'green'}, #设置饼图内外边界的属性值
    18. textprops={'fontsize':15, 'color':'black'} #设置文本标签的属性值
    19. )
    20. plt.show()

    折线图

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

    1. import pandas as pd
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. plt.rcParams['font.sans-serif']=['STKaiTi'] #用来正常显示中文标签
    5. plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
    6. plt.figure(num = 1,dpi=300)
    7. # 数据
    8. X = [1,2,3,4,5,6,7] # 序号
    9. y = [68,69,79,71,80,70,66] # 重量
    10. plt.title('折线图')
    11. # 画图
    12. plt.plot(X, y, color = 'b',linestyle ='--', marker='*',alpha=0.5, linewidth=1, label='训练')
    13. '''
    14. color:颜色;linestyle:线条种类(实线、虚线);marker:点的形状;
    15. alpha:透明度;linewidth:线宽; label:这条线的图例标签
    16. '''
    17. # 标注
    18. for i in range(len(X)):
    19. plt.text(X[i], y[i]+0.1, f'{y[i]:d}', ha='center', va='bottom', fontsize=7.5)
    20. # 后续修饰
    21. plt.xlabel('序号',fontsize = 15) #x轴的标签,即x代表的东西,在这里是序号
    22. plt.ylabel('重量',fontsize = 15)#y轴的标签,即x代表的东西,在这里是重量
    23. plt.xticks(fontsize = 12) # x轴刻度
    24. plt.yticks(fontsize = 12) # y轴刻度
    25. plt.legend() #显示图例,即上方的label
    26. plt.show()

    余弦函数 

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. plt.rcParams['font.sans-serif'] = ['STKaiTi']
    4. plt.rcParams['axes.unicode_minus'] = False
    5. plt.title('sin-cos函数图像')
    6. t = np.arange(0.0, 2*np.pi, 0.01) #自变量取值范围
    7. s = np.sin(t) #计算正弦函数值
    8. c = np.cos(t) #计算余弦函数值
    9. plt.plot(t,s,label='正弦',color='red') #颜色
    10. plt.plot(t,c, label='余弦', color='blue')
    11. plt.xlabel('x-变量')
    12. plt.ylabel('y-正弦余弦函数值')
    13. plt.legend() #显示图例
    14. plt.show() #显示绘制的结果图像

    环形图

    其实就是利用中心画一个白色的饼图,使得外面的饼图呈现一种环形的样子

    1. import matplotlib.pyplot as plt
    2. plt.rcParams['font.sans-serif'] = ['STKaiTi']
    3. plt.rcParams['axes.unicode_minus']=False
    4. # 不同类型的占比
    5. plt.figure(num = 1,dpi = 300)
    6. plt.title('不同类型的占比')
    7. valTrain = [1, 2, 3, 4]
    8. valTest = [2, 3, 4, 5]
    9. labelTrain = ['A', 'B', 'C']
    10. labelTest = ['A', 'B', 'C']
    11. colors = ['coral','gold','skyblue']
    12. # 第一步:画出外部饼图。训练集
    13. plt.pie(valTrain ,
    14. # labels = labelTrain, # 标签,如果注释掉就不显示饼图文本标签
    15. colors = colors,
    16. autopct='%.2f%%', #设置百分比的格式,这里保留两位小数
    17. pctdistance=0.9, #设置百分比标签与圆心的距离
    18. labeldistance=0.8, #设置标签与圆心的距离
    19. startangle=90, #设置饼图的初始角度
    20. radius=1.2, #设置饼图的半径
    21. counterclock=False, #是否逆时针,这里设置为顺时针方向
    22. wedgeprops={'linewidth':1.5,'edgecolor': "w"}, #设置饼图内外边界的属性值
    23. textprops={'fontsize':8, 'color':'black'} #设置文本标签的属性值
    24. )
    25. plt.legend(labels = labelTrain,loc = 'center') # 显示图例,在这里显示图例,后面的图例就不显示了
    26. # 第二步:画出内部饼图。测试集
    27. plt.pie(valTest,
    28. #labels = labelTest, # 标签,如果注释掉就不显示饼图文本标签
    29. colors = colors,
    30. autopct='%.2f%%', #设置百分比的格式,这里保留两位小数
    31. pctdistance=0.9, #设置百分比标签与圆心的距离
    32. labeldistance=0.8, #设置标签与圆心的距离
    33. startangle=90, #设置饼图的初始角度
    34. radius=1, #设置饼图的半径
    35. counterclock=False, #是否逆时针,这里设置为顺时针方向
    36. wedgeprops={'linewidth':1.5,'edgecolor': "w"}, #设置饼图内外边界的属性值
    37. textprops={'fontsize':8, 'color':'black'} #设置文本标签的属性值
    38. )
    39. # 第三步:画出中间的白色饼图,使饼图呈现环形图的样式
    40. plt.pie([1], # 设置数据为[1]
    41. colors = ['w'], # 白色的饼图
    42. radius=0.8, #设置饼图的半径
    43. )
    44. plt.show()

    子图

    子图存在不同的画法

    使用plt.subplot()划分出子图的区域

    这里使用plt.subplot(1,2,1)相当于划分了一个属于该子图的区域,

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. plt.figure(dpi=300)
    4. x= np.linspace(0, 2*np.pi, 500) #创建自变量数组
    5. y1 = np.sin(x) #创建函数值数组
    6. y2 = np.cos(x)
    7. plt.subplot(1,2,1)
    8. plt.plot(x, y1, color='red')
    9. plt.subplot(1,2,2)
    10. plt.plot(x, y2, color='blue')

     这种主打一个简单方便,但是不便于对每个子图进行不同设置

    fig.add_subplot()创建子图对象

    使用这个能很方面地分别对子图进行详细设置 

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure(dpi=300)
    4. fig.suptitle('子图')
    5. # 添加子图对象
    6. ax1 = fig.add_subplot(2,2,1,facecolor = 'pink') # 把绘图区域切分为两行两列,选择两行两列的第一个区域
    7. ax2 = fig.add_subplot(2,2,2,facecolor = 'y') #选择两行两列的第二个区域
    8. ax3 = fig.add_subplot(2,1,2,facecolor = 'skyblue') #把绘图区域切分为两行一列,选择两行一列的第二个区域
    9. # 调节子图与画布标题之间的间距为0.9
    10. # 调整子图之间的垂直间距为0.5
    11. plt.subplots_adjust(top=0.9,hspace=0.5)
    12. # 数据
    13. x= np.linspace(0, 2*np.pi, 500) #创建自变量数组
    14. y1 = np.sin(x) #创建函数值数组
    15. y2 = np.cos(x)
    16. y3 = np.tan(x)
    17. # 子图1
    18. ax1.set_title('正弦')
    19. ax1.plot(x, y1, color='red',label ='$sin(x)$') # 设置图例显示公式
    20. ax1.set_xlabel("x坐标")
    21. ax1.set_ylabel("y坐标")
    22. ax1.set_ylim(-1.2, 1.2)
    23. ax1.legend(fontsize=5,loc = 'upper left')
    24. # 子图2
    25. ax2.set_title('余弦')
    26. ax2.plot(x, y2, color='red',label ='$cos(x)$' )
    27. ax2.set_ylim(-1.2, 1.2)
    28. ax2.legend(fontsize=5,loc = 'upper left')
    29. # 子图3
    30. ax3.set_title('正切')
    31. ax3.plot(x, y3, color='red',label='$tan(x)$')
    32. ax3.set_ylim(-10, 10)
    33. ax3.legend(fontsize=5,loc = 'upper left')
    34. plt.show()

    直方图

    使用seaborn.histplot(data,kde = True),

    kde = True:控制是否绘制核密度估计(Kernel Density Estimation,核密度估计)曲线,核密度估计是一种用于估计数据分布的平滑方法,它通过对数据进行平滑处理来生成一个连续的概率密度函数曲线。

    1. import seaborn as sns
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. data = np.random.normal(loc=0, scale=1, size=1000)# 随机生成1000个服从正态分布的数据
    5. # 使用Seaborn绘制直方图
    6. sns.histplot(data, kde=True)
    7. plt.title("直方图")
    8. plt.xlabel("X轴")
    9. plt.show()

    热力图

    相关系数热力图

    首先计算出每个属性之间的相关系数df.corr(),使用sns.heatmap(df.corr(),annot=True)画出相关系数热力图

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. import seaborn as sns
    4. plt.rcParams ['font.sans-serif'] = ['SimHei']
    5. # 数据
    6. data = {
    7. '消费频率': [1, 1, 1, 1, 2, 1, 1, 1, 1, 1],
    8. '最近消费时间间隔': [5.270231481, 41.35841435, 301.2756944, 39.5953125, 447.0455324, 710.4631829, 548.5095602, 3.467372685, 312.4875694, 283.4523727],
    9. '消费金额': [14.9, 51.87, 178.68, 65.4, 411.5, 48.86, 81.75, 70.4, 22.39, 45.37]
    10. }
    11. df = pd.DataFrame(data)
    12. corr = df.corr()
    13. # 热力图
    14. plt.figure(figsize=(10,10))
    15. sns.heatmap(corr, annot=True, # 在每个热力图单元格中显示数值。
    16. fmt='.3f', # 指定了显示数值的格式,保留3位小数
    17. cmap='Blues', # 指定了用于着色的颜色映射,这里使用了蓝色调色板
    18. xticklabels=['A','B','C'], yticklabels=['A','B','C'] # 用于指定x轴和y轴的标签
    19. )

    混淆矩阵热力图

    原理是一样的 

    3D图

    三维曲线

    看不懂,了解一下,3D曲线就可以了

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. plt.rcParams ['font.sans-serif'] = ['STKaiTi']
    4. fig = plt.figure()
    5. ax=plt.axes(projection='3d')
    6. theta = np.linspace(-4 * np.pi, 4 * np.pi, 200)
    7. z = np.linspace(-4, 4, 200)*0.4 #创建模拟数据
    8. r = z**3 + 1
    9. x = r * np.sin(theta)
    10. y = r * np.cos(theta)
    11. ax.plot(x,y,z,label='三维曲线')
    12. ax.legend() #显示图例
    13. plt.show() #显示绘制结果

     3D曲面图

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. from mpl_toolkits.mplot3d import Axes3D # 使用Matplotlib的mpl_toolkits.mplot3d库来创建一个3D坐标轴对象
    4. # 生成数据
    5. x = np.linspace(0, 4, 1000)
    6. y = np.linspace(0, 4, 1000)
    7. x1, y1 = np.meshgrid(x, y)
    8. x2 = x1.flatten()
    9. y2 = y1.flatten()
    10. xy = np.vstack([x2, y2])
    11. zxy = lambda t: np.exp(t[0]) *t[1]
    12. z = zxy(xy)
    13. plt.figure(dpi=300)
    14. ax = plt.axes( projection='3d') # 创建3D坐标轴对象
    15. ax.plot_surface(x1, y1, z.reshape(x1.shape), cmap='viridis') # 绘制3D曲面图
    16. # 设置坐标轴标签
    17. ax.set_xlabel('X')
    18. ax.set_ylabel('Y')
    19. ax.set_zlabel('Z')
    20. ax.set_title('3D曲面图')
    21. plt.show()

    关于meshgrid的用法可以看这个http://t.csdnimg.cn/OIby1

    三维柱状图

    1. # 绘制三维柱状图
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. x = np.random.randint(0, 40, 10) #创建测试数据
    5. y = np.random.randint(0, 40, 10)
    6. z = 80*abs(np.sin(x+y))
    7. plt.figure(dpi = 300)
    8. ax = plt.subplot(projection='3d') #绘制三维图形
    9. ax.bar3d(x, #设置x轴数据
    10. y, #设置y轴数据
    11. np.zeros_like(z), #设置柱的z轴起始坐标为0
    12. dx=5, #x方向的宽度
    13. dy=5, #y方向的厚度
    14. dz=z, #z方向的高度
    15. color='red') #设置面片颜色为红色
    16. ax.set_xlabel('X')
    17. ax.set_ylabel('Y')
    18. ax.set_zlabel('Z')
    19. plt.show()

    雷达图

    可以说几乎用不到,这里只是写一下

    要注意收尾相接

    1. # 例7 绘制雷达图。
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. labels = np.array(list('abcdefghij')) #设置标签
    5. data = np.array([11,4]*5) #创建模拟数据array([11, 4, 11, 4, 11, 4, 11, 4, 11, 4])
    6. dataLength = len(labels) #数据长度
    7. #angles数组把圆周等分为dataLength份
    8. angles = np.linspace(0, #数组第一个数据
    9. 2*np.pi, #数组最后一个数据
    10. dataLength, #数组中数据数量
    11. endpoint=False) #不包含终点
    12. #首尾相接,使得曲线闭合
    13. data = np.append(data, data[0])
    14. angles = np.append(angles, angles[0])
    15. labels = np.append(labels, labels[0])
    16. plt.polar(angles, #设置角度
    17. data, #设置各角度上的数据
    18. 'rv--', #设置颜色、线型和端点符号
    19. linewidth=2) #设置线宽
    20. #设置角度网格标签
    21. plt.thetagrids(angles*180/np.pi, #角度
    22. labels) #标签
    23. #设置填充色
    24. plt.fill(angles, #设置角度
    25. data, #设置各角度上的数据
    26. facecolor='r', #设置填充色
    27. alpha=0.6) #设置透明度
    28. plt.ylim(0,12) #设置坐标跨度
    29. plt.show() #显示绘图结果

    图例legend设置

    总的来说,挺牛逼哄哄的,让我写写不出来。

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. plt.rcParams ['font.sans-serif'] = ['STKaiTi']
    4. t = np.arange(0.0, 2*np.pi, 0.01)
    5. s = np.sin(t)
    6. c = np.cos(t)
    7. plt.figure(dpi=300)
    8. plt.plot(t, s, label='正弦')
    9. plt.plot(t, c, label='余弦')
    10. plt.title('sin-cos函数图像')
    11. plt.legend(title='Legend', #设置图例标题
    12. loc='lower left', #设置图例参考位置
    13. bbox_to_anchor=(0.43,0.75),#设置图例位置偏移量
    14. shadow=True, #显示阴影
    15. facecolor='yellowgreen', #设置图例背景色
    16. edgecolor='red', #设置图例边框颜色
    17. ncol=2, #显示为两列
    18. markerfirst=False) #设置图例文字在前,符号在后
    19. plt.show()

  • 相关阅读:
    Spring中常见的参数解析器
    Springboot毕设项目工商闲置单车销售平台2r343(java+VUE+Mybatis+Maven+Mysql)
    DevOps和CI/CD以及在微服务架构中的作用
    观察者模式的运用——消息队列
    ChatGPT与音乐领域的新篇章
    html5期末大作业:基于html+css+javascript+jquery+bootstarp响应式图书电商HTML模板网上书店(25页)
    线程同步—— 生产者与消费者、龟兔赛跑、双线程打印
    Linux 进程终止 进程等待 进程替换 简易shell
    中文编程开发语言工具应用案例:ps5体验馆计时收费管理系统软件
    【数据结构】深入探讨二叉树的遍历和分治思想(一)
  • 原文地址:https://blog.csdn.net/m0_67173953/article/details/132650626