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

news2025/1/18 11:57:17

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

目录

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 画柱状图

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

  • 图的边框要设置成黑色,边框线宽为2;
  • 图内部要包含网格线;
  • 柱状图中柱子也要包含边框,边框颜色为黑色;
  • 网格线要位于柱子的下方;
  • 图片字体要设置成‘Times New Roman’,要对图片所有字体的大小进行设置;
  • y轴域值也要进行设置,不是从0开始;
  • 图片的标签(图标)要横着排列(不是竖着排列);
  • 柱子上方要显示具体数值;
  • 一个标签对应多个柱子(为了做对比)

画出的图片展示:

(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, 3
width = total_width/n
# xticks 就是三个柱子的开始位置
xticks = x_len - (total_width - width) / 2

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

x_len
Out[1]: array([0, 1, 2])
xticks
Out[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.0
ax.spines['bottom'].set_color('black')
# 顶部线
ax.spines['top'].set_linewidth('2.0')#设置边框线宽为2.0
ax.spines['top'].set_color('black')
# 右侧线
ax.spines['right'].set_linewidth('2.0')#设置边框线宽为2.0
ax.spines['right'].set_color('black')
# 左侧线
ax.spines['left'].set_linewidth('2.0')#设置边框线宽为2.0
ax.spines['left'].set_color('black')

(10)显示图

plt.show()

4 整体代码

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

import json
import torch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

f1_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, 3
width = 0.3
xticks = x_len - (total_width - width) / 2
plt.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.0
ax.spines['bottom'].set_color('black')
ax.spines['top'].set_linewidth('2.0')#设置边框线宽为2.0
ax.spines['top'].set_color('black')
ax.spines['right'].set_linewidth('2.0')#设置边框线宽为2.0
ax.spines['right'].set_color('black')
ax.spines['left'].set_linewidth('2.0')#设置边框线宽为2.0
ax.spines['left'].set_color('black')

plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宿舍管理系统的设计与实现/学生宿舍管理系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

反向散射耦合RFID系统的原理及特点,带你更深入的了解

一.反向散射耦合RFID系统 1.反向散射 雷达技术为RFID的反向散射耦合方式提供了理论和应用基础。当电磁波遇到空间目标时,其能量的一部分被目标吸收,另一部分以不同的强度散射到各个方向。在散射的能量中,一小部分反射回发射天线,并…

Cadence orcad 原理图导出带书签目录的办法

Cadence orcad 导出pdf,方便软件工程师或者其他人员查看,但是Cadence自带的导出pdf的办法不能同时导出书签目录,不利于查看,这片文章就是介绍怎么使用Cadence orcad 原理图导出带书签目录的pdf,这里以cadence16.6举例。…

G1 垃圾回收器

引用: G1垃圾收集器详解_fyygree的博客-CSDN博客 深入解析G1垃圾收集器与性能优化_铁锚的博客-CSDN博客 垃圾回收器之 G1 垃圾回收器_嘿,鱼骨头^O^的博客-CSDN博客 G1是一款增量式的分代垃圾收集器 G1 物理上不分代,默认会将整个内存区域…

React - Jsx 概述

React - Jsx 概述 JSX 概述 目标: 了解 JSX 是什么、与 React.createElement 之间的关系 JSX 语法是另一种在 React 中创建元素的方式 使用他创建元素更加的简单 直接。 JSX 是 javaScript XML 简写 可以理解为在 JavaScript 中写 XML 格式的代码 const list (&…

力扣(LeetCode)808. 分汤(C++)

动态规划 如图,本题的状态表示,是二维 dpdpdp f[i,j]f[i,j]f[i,j] , iii 表示剩余的 aaa , jjj 表示剩余的 bbb , f[i,j]f[i,j]f[i,j] 表示 aaa 先取完的概率 。 按照 i/ji/ji/j 的剩余数量做集合划分 ①当 i≤0,j≤0…

代码冲突的产生以及解决方式

Git代码冲突解决 为什么会产生代码冲突? 远程仓库的某个文件内容发生了修改,而本地没有及时进行pull拉取,那么就会导致本地的分支落后。当修改完本地代码再push到远程的时候,就会产生代码冲突。如何避免产生代码冲突?…

GitHub标星75k,阿里15W字的Spring高级文档(全彩版)真的太香了

随着 Spring 使用越来越广泛,Spring 已经成为 Java 程序员面试的必问知识点,很多同学对于Spring理解不是那么的深刻,经常就会被几个连环追问给干趴了! 今天小编整理了一下一线架构师的Spring源码高级文档:SpringSprin…

基础:BS(Browser/Server)、CS(Client/Server)架构

一、BS(Browser/Server) 所有浏览器应用都是BS架构。 BS(Browser/Server):浏览器 / 服务器结构。BS是伴随着Internet技术的兴起,对C/S架构的改进,为了区别于传统的C/S 模式,特意称为…

亚马逊、沃尔玛、美客多测评补单是什么?自养号需要解决哪些问题?

​做跨境电商很多卖家会疑惑测评(补单)是什么?为什么需要测评或者补单? 其实测评或补单都是类似于国内电商(某宝,某东)的刷单。 测评补单作用:快速提高产品的排名、权重和销量 可…

如何在 VMware Workstation 16.2 中安装 Ubuntu 20.04

安装 Ubuntun 20.04 如今,Linux 操作系统越来越受欢迎。大多数服务器都使用Linux操作系统,个人系统也开始使用各种 Linux 发行版。Ubuntu 是流行的 Linux 操作系统之一。 一、在搜栏中搜索 VMware Workstation 并打开它 二、在主页上点击“创建新的虚拟机”。当你开始准备时…

TensorFlow中的tf.nn.softmax_cross_entropy_with_logits_v2函数详解

一、函数介绍 函数形式:tf.nn.softmax_cross_entropy_with_logits_v2(labelslabels, logitslogits) 需要注意的是,此处是最常见的参数形式,即只有labels和logits参数。为了简单起见,这里不对其他参数进行赘述。其中,…

【AtCoder】离线询问+树状数组

文章目录题目描述题意思路代码D - AtCoder Express 2 题目描述 input#1: 2 3 1 1 1 1 2 2 2 1 2 output#1: 3 input#2: 10 3 2 1 5 2 8 7 10 1 7 3 10 output#2: 1 1 input#3: 10 10 10 1 6 2 9 4 5 4 7 4 7 5 8 6 6 …

【虹科案例】极高的精度水平——虹科数字化仪在大型强子对撞机机器保护系统中的应用

大型强子对撞机机器保护系统 CERN(欧洲核子研究中心) 的大型强子对撞机 (LHC) 的机器保护系统中使用了140 多张虹科数字化仪卡。这些板卡用于检查粒子束是否已准确偏转。这需要极高的精度,因为在 27 公里 LHC 加速器环中,两束高能…

19182 石子合并(基础版)

题目 19182 石子合并(基础版) 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: 不限定 Description 设有 N(N≤300) 堆石子排成一排,其编号为1,2,3,⋯,N。每堆石子有一定的质量 mi(mi≤1000)。 现在要将这N堆…

什么是JavaScript一文教会你

目录 文章目录**二、什么是JavaScript,有什么用?**三、HTML嵌入JavaScript的方式:第一种方式:第二种方式:第三种方式:四、JavaScript的变量五、函数初步**函数参数中的几个场景****情景1:传入参数不足****…

MyBatis--自定义映射resultMap

1.处理下划线与属性名不一致的方法 字段名和属性名不一致的情况 , 如何处理映射关系 解决方法 : 1. 为查询的字段设置别名 , 和属性名保持一致 例 : selectemp_id empId , emp_name empName , age , genderfromt_emp where emp_id #{empId} 2. 当字段符合MySql 的要求使用 _…

软文发布推广需要注意的问题有哪些

随着互联网的发展,软文发稿这种以文章为载体、并带有很强隐蔽性的广告形式也得到了飞速发展,这种营销形式实际上具有非常广泛的传播性、并兼具成本低、权威性等优势,可有效帮助企业实现品牌的宣传推广、提升产品的销售转化率。那么软文发稿需…

上海亚商投顾:沪指探底回升 供销社、新冠检测概念领涨

上海亚商投顾前言:无惧大盘大跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪A股今日小幅调整,三大指数盘初均跌超1%,随后震荡回升跌幅收窄,创业板指一度接近…

Android 发布自己的sdk

作为一个开发,总是会跟开源组件打交道,现在记下我自己写的开源组件遇到的问题 1.创建一个Android Library 2.修改build.gradle plugins {id com.android.application } 里面的id com.android.application 改为 id com.android.library android {compileSdk 32defaultConf…