文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用python画柱状图(matplotlib.pyplot)-- 你想要的设置这张图基本都包括

2023-09-04 18:16

关注

本人写论文时画的图,总结一下方法: 安心看下去,你应该就可以画出一个好看的柱状图,基本上需要的设置都有哦!!!

目录

1 首先引入画图所需要的包Matplotlib

2 Matplotlib Pyplot

3 画柱状图

4 整体代码


1 首先引入画图所需要的包Matplotlib

Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。

Matplotlib 通常与 NumPy 和 SciPy(Scientific Python)一起使用

2 Matplotlib Pyplot

Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。

Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。

使用 import 导入 pyplot 库,并设置一个别名 plt:

import matplotlib.pyplot as plt

3 画柱状图

这里我画的柱状图有以下设置:(应该包含了对柱状图画图的所有基本设置)

画出的图片展示:

(1) 首先,设置X轴标签,以及X轴标签对应的y值。

import matplotlib.pyplot as plt# X轴标签x = ['Data-15','Data-17','Data-18']# 这里是一个标签对应两个柱子,所以有两个数组(这实际上是不同模型在同一数据集上的的f1值对比)f1_1 = [93.70,92.17,84.89]f1_2 = [95.76,93.35,89.20]

(2)要定位好柱子的开始位置(因为上述设置了3个X轴标签,所以这里要定位3个柱子的开始位置)

x_len = np.arange(len(x))total_width, n = 0.9, 3width = total_width/n# xticks 就是三个柱子的开始位置xticks = x_len - (total_width - width) / 2

可以看一下 x_lenxticks具体对应的值:

x_lenOut[1]: array([0, 1, 2])xticksOut[2]: array([-0.3,  0.7,  1.7])

(3)定义图片大小,为图片画上网格

        具体的解释,代码里有写;

plt.figure(figsize=(15, 12), dpi=200)# 这里定义ax,是为了后面画图的边框所用ax = plt.axes()# axis取值可以为'both','x','y', both是网格,x是只有垂直于x轴的线,y是只有垂直于yz轴的线# c是设置线的颜色,linestyle 是画出的线的类型, zorder 是让线位于柱子下面而设置的,其值越小,线越靠下plt.grid(axis="y", c='#d2c9eb', linestyle = '--',zorder=0)

(4)开始画柱子,并设置画柱子所需要的属性

        因为每个X轴标签都对应了两个柱子,所以这里要调用两个plt.bar;

        也就是说调用几个plt.bar,每个x轴标签就画几个柱子;

        具体属性的解释,看下面代码中的注释;

# 画第一个柱子,是批量画的,X轴的每个标签都开始画第一个柱子# f1_1就是X轴所有标签对应的第一个柱子的y值# width是设置柱子的宽度# label就是图例# color设置颜色# edgecolor是设置柱子框的颜色# linewidth是设置柱子框的线宽# zorder 是保证柱子位于网格线的上方plt.bar(xticks, f1_1, width=0.9*width, label="Attention weights", color="#7e728c",edgecolor='black',linewidth = 2,  zorder=10)# xticks + width,表示的是X轴所有标签第二个柱子的起始位置plt.bar(xticks + width, f1_2, width=0.9*width, label="Official", color="#46513c",edgecolor='black',linewidth = 2, zorder=10)

(4)为柱子上方添加数值

        顺便设置数字的字体;

# 这是为X轴所有标签的第一个柱子写上值# f1_1[0] + 0.3 表示写的值要距离柱子0.3个单位# f1_1[0]是具体要写的值# ha='center' 表示值要居中写# fontproperties 是设置字体类型# fontsize 设置字体大小# zorder=10 表示位于网格线上方plt.text(xticks[0], f1_1[0] + 0.3, f1_1[0], ha='center',fontproperties='Times New Roman',  fontsize=35,  zorder=10)plt.text(xticks[1], f1_1[1] + 0.3, f1_1[1], ha='center', fontproperties='Times New Roman', fontsize=35,  zorder=10)plt.text(xticks[2], f1_1[2] + 0.3, f1_1[2], ha='center', fontproperties='Times New Roman', fontsize=35,  zorder=10)# 这是为X轴所有标签的第二个柱子写上值plt.text(xticks[0] + width, f1_2[0] + 0.3, f1_2[0], ha='center',fontproperties='Times New Roman', fontsize=35,  zorder=10)plt.text(xticks[1] + width, f1_2[1] + 0.3, f1_2[1], ha='center',fontproperties='Times New Roman', fontsize=35,  zorder=10)plt.text(xticks[2] + width, f1_2[2] + 0.3, f1_2[2], ha='center', fontproperties='Times New Roman',fontsize=35,  zorder=10)

(5)设置图例的字体

# ncol = 2 表示图例要放两列plt.legend(prop={'family' : 'Times New Roman', 'size': 35}, ncol = 2)

(6)设置X轴,Y轴标签的字体及大小

# x_len表示X轴的标签写在哪个坐标位置,有事可能x_len有变差,需要手动调一下他的值,不过偏差不会很大plt.xticks(x_len, x, fontproperties='Times New Roman',fontsize = 40)plt.yticks(fontproperties='Times New Roman',fontsize = 40)

(7)控制Y轴的值

plt.ylim(75,90)# 或者只设置最小值plt.ylim(ymin=75)

(8)设置对柱状图X轴的说明和Y轴的说明

plt.xlabel("Datasets", fontproperties='Times New Roman',fontsize=45)plt.ylabel("Accuracy (%)",fontproperties='Times New Roman', fontsize=45)

(9)为柱状图画黑色的框

# 底部线ax.spines['bottom'].set_linewidth('2.0')#设置边框线宽为2.0ax.spines['bottom'].set_color('black')# 顶部线ax.spines['top'].set_linewidth('2.0')#设置边框线宽为2.0ax.spines['top'].set_color('black')# 右侧线ax.spines['right'].set_linewidth('2.0')#设置边框线宽为2.0ax.spines['right'].set_color('black')# 左侧线ax.spines['left'].set_linewidth('2.0')#设置边框线宽为2.0ax.spines['left'].set_color('black')

(10)显示图

plt.show()

4 整体代码

大家可以在这里复制全部代码,跑出上面的柱状图。

import jsonimport torchimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltf1_1 = [93.70,92.17,84.89]f1_2 = [95.76,93.35,89.20]x = ['Data-15','Data-17','Data-18']x_len = np.arange(len(x))total_width, n = 0.9, 3width = 0.3xticks = x_len - (total_width - width) / 2plt.figure(figsize=(15, 12), dpi=200)ax = plt.axes()plt.grid(axis="y", c='#d2c9eb', linestyle = '--',zorder=0)plt.bar(xticks, f1_1, width=0.9*width, label="Attention weights", color="#92a6be",edgecolor='black',linewidth = 2,  zorder=10)plt.bar(xticks + width, f1_2, width=0.9*width, label="Official", color="#c48d60",edgecolor='black',linewidth = 2, zorder=10)plt.text(xticks[0], f1_1[0] + 0.3, f1_1[0], ha='center',fontproperties='Times New Roman',  fontsize=35,  zorder=10)plt.text(xticks[1], f1_1[1] + 0.3, f1_1[1], ha='center', fontproperties='Times New Roman', fontsize=35,  zorder=10)plt.text(xticks[2], f1_1[2] + 0.3, f1_1[2], ha='center', fontproperties='Times New Roman', fontsize=35,  zorder=10)plt.text(xticks[0] + width, f1_2[0] + 0.3, f1_2[0], ha='center',fontproperties='Times New Roman', fontsize=35,  zorder=10)plt.text(xticks[1] + width, f1_2[1] + 0.3, f1_2[1], ha='center',fontproperties='Times New Roman', fontsize=35,  zorder=10)plt.text(xticks[2] + width, f1_2[2] + 0.3, f1_2[2], ha='center', fontproperties='Times New Roman',fontsize=35,  zorder=10)plt.legend(prop={'family' : 'Times New Roman', 'size': 35}, ncol = 2)x_len = [-0.1,0.9,1.9]x_len = np.array(x_len)plt.xticks(x_len, x, fontproperties='Times New Roman',fontsize = 40)plt.yticks(fontproperties='Times New Roman',fontsize = 40)plt.ylim(ymin=75)plt.xlabel("Datasets", fontproperties='Times New Roman',fontsize=45)plt.ylabel("Accuracy (%)",fontproperties='Times New Roman', fontsize=45)ax.spines['bottom'].set_linewidth('2.0')#设置边框线宽为2.0ax.spines['bottom'].set_color('black')ax.spines['top'].set_linewidth('2.0')#设置边框线宽为2.0ax.spines['top'].set_color('black')ax.spines['right'].set_linewidth('2.0')#设置边框线宽为2.0ax.spines['right'].set_color('black')ax.spines['left'].set_linewidth('2.0')#设置边框线宽为2.0ax.spines['left'].set_color('black')plt.show()

来源地址:https://blog.csdn.net/qq_40671063/article/details/127972727

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯