python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()]
python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()]
效果图如下所示:

就是这个样子,一般比较少见将柱形图从上往下绘制的。可能是会为了更好的展示数据对比结果吧。这里绘图的主要思路如下:
- 利用
ax.twinx()这个函数生成一个新的x轴(相当于复制了一个x轴) - 使用
ax.invert_yaxis()这个函数反转新x轴对应的y轴,使其从图中左边0-100排列变成100-0排列,这样就保证了图片从顶往底显示的效果 - 手动设置新的y轴的ticklabel,使其展现为0-100排列。
具体步骤如下所示:
1、首先是生成随机一组数据并绘制柱形图:
import numpy as np
import matplotlib.ticker as mticker
import matplotlib.pyplot as plt
###########################################################################
plt.rcParams['font.sans-serif']=['SimHei']#中文
plt.rcParams['axes.unicode_minus']=False #显示负号
# ####################################data#################################
n=6
y = np.linspace(10,70,n)
y1 = np.linspace(10,60,n)
y2 = np.linspace(10,50,n)
x=np.linspace(2000,2020,n)data = np.array([y,y1,y2])
width = 0.6
# ####################################draw#################################
fig=plt.figure(figsize=(5,7),dpi=500)#添加画布等
ax=fig.add_axes([0,0,1,0.3])
ax.set(xlim=(2000,2021),ylim=(0,100))
bar1=ax.bar(x - width,data[0],# color=np.where(y>0,'r','b'), #判断大于0的为红色,负的为蓝色width=0.5, #柱形宽度align='center', #柱形的位置edge/center alpha=0.8, #柱形透明度hatch='*', #柱形表明的形状样式edgecolor='k',#柱形边缘颜色bottom=0.01 #柱形离底部的距离)
bar2=ax.bar(x + width,data[1],# color=np.where(y>0,'r','b'), #判断大于0的为红色,负的为蓝色width=0.5, #柱形宽度align='center', #柱形的位置edge/center alpha=0.8, #柱形透明度hatch='*', #柱形表明的形状样式edgecolor='k',#柱形边缘颜色bottom=0.01 #柱形离底部的距离)
bar3=ax.bar(x ,data[2],# color=np.where(y>0,'r','b'), #判断大于0的为红色,负的为蓝色width=0.5, #柱形宽度align='center', #柱形的位置edge/center alpha=0.8, #柱形透明度hatch='*', #柱形表明的形状样式edgecolor='k',#柱形边缘颜色bottom=0.01 #柱形离底部的距离)
##########################################################################
ax.set(xlim=(1999,2021),ylim=(0,100)) #设置x、y轴的最大最小范围
ax.set_xticks(np.linspace(2000, 2020, n)) #设置x轴显示的标签 #添加注释
ax.axhline(y=0,c='k',ls=':',lw=1) #添加水平线,设置颜色,位置,水平线的style
#设置轴的参数,间隔
ax.tick_params(axis='both',which='both',direction='in')
ax.yaxis.set_minor_locator(mticker.MultipleLocator(5))
ax.xaxis.set_minor_locator(mticker.MultipleLocator(5))
# 设置label
ax.set_xlabel('年份 (Year)')
ax.set_ylabel('数值 (%) ')
ax.set_title('柱状图',fontsize=10)

2、复制一个新的x轴,并生成一组数据绘制柱形图
ax2 = ax.twinx()
ax2.set(xlim=(1999,2021),ylim=(100))
bar4 = ax2.bar(x,np.linspace(4,6,n),width=0.5, #柱形宽度align='center', #柱形的位置edge/center alpha=0.8, #柱形透明度hatch='*', #柱形表明的形状样式edgecolor='k',#柱形边缘颜色bottom=0.01 , #柱形离底部的距离color='r')
ax2.yaxis.set_minor_locator(mticker.MultipleLocator(5))

3、翻转y轴,稍微调整一下tick的方向
ax2.invert_yaxis()
ax2.tick_params(axis='both',tickdir='in')
ax2.tick_params(which='minor',tickdir='in')

4、 重新定义ticklabel的值
ax2.set_yticklabels(['0','20','40','60','80','100'][::-1])

以下是全部的代码:
# -*- coding: utf-8 -*-
"""
Created on Tue Feb 21 14:49:36 2023@author: jianpu@blog : https://blog.csdn.net/weixin_44237337?spm=1000.2115.3001.5343@email: 211311040008@hhu.edu.cnintroduction : keep learning althongh walk slowly
"""import numpy as np
import matplotlib.ticker as mticker
import matplotlib.pyplot as plt
###########################################################################
plt.rcParams['font.sans-serif']=['SimHei']#中文
plt.rcParams['axes.unicode_minus']=False #显示负号
# ####################################data#################################
n=6
y = np.linspace(10,70,n)
y1 = np.linspace(10,60,n)
y2 = np.linspace(10,50,n)
x=np.linspace(2000,2020,n)data = np.array([y,y1,y2])
width = 0.6
# ####################################draw#################################
fig=plt.figure(figsize=(5,7),dpi=500)#添加画布等
ax=fig.add_axes([0,0,1,0.3])
ax.set(xlim=(2000,2021),ylim=(0,100))
bar1=ax.bar(x - width,data[0],# color=np.where(y>0,'r','b'), #判断大于0的为红色,负的为蓝色width=0.5, #柱形宽度align='center', #柱形的位置edge/center alpha=0.8, #柱形透明度hatch='*', #柱形表明的形状样式edgecolor='k',#柱形边缘颜色bottom=0.01 #柱形离底部的距离)
bar2=ax.bar(x + width,data[1],# color=np.where(y>0,'r','b'), #判断大于0的为红色,负的为蓝色width=0.5, #柱形宽度align='center', #柱形的位置edge/center alpha=0.8, #柱形透明度hatch='*', #柱形表明的形状样式edgecolor='k',#柱形边缘颜色bottom=0.01 #柱形离底部的距离)
bar3=ax.bar(x ,data[2],# color=np.where(y>0,'r','b'), #判断大于0的为红色,负的为蓝色width=0.5, #柱形宽度align='center', #柱形的位置edge/center alpha=0.8, #柱形透明度hatch='*', #柱形表明的形状样式edgecolor='k',#柱形边缘颜色bottom=0.01 #柱形离底部的距离)
##########################################################################
ax.set(xlim=(1999,2021),ylim=(0,100)) #设置x、y轴的最大最小范围
ax.set_xticks(np.linspace(2000, 2020, n)) #设置x轴显示的标签 #添加注释
ax.axhline(y=0,c='k',ls=':',lw=1) #添加水平线,设置颜色,位置,水平线的style
#设置轴的参数,间隔
ax.tick_params(axis='both',which='both',direction='in')
ax.yaxis.set_minor_locator(mticker.MultipleLocator(5))
ax.xaxis.set_minor_locator(mticker.MultipleLocator(5))
# 设置label
ax.set_xlabel('年份 (Year)')
ax.set_ylabel('数值 (%) ')
ax.set_title('柱状图',fontsize=10)#添加图例
ax2 = ax.twinx()
ax2.invert_yaxis()
ax2.set(xlim=(1999,2021),ylim=(100))
ax2.set_yticklabels(['0','20','40','60','80','100'][::-1])
bar4 = ax2.bar(x,np.linspace(4,6,n),width=0.5, #柱形宽度align='center', #柱形的位置edge/center alpha=0.8, #柱形透明度hatch='*', #柱形表明的形状样式edgecolor='k',#柱形边缘颜色bottom=0.01 , #柱形离底部的距离color='r')
ax2.yaxis.set_minor_locator(mticker.MultipleLocator(5))
ax2.tick_params(axis='both',tickdir='in')
ax2.tick_params(which='minor',tickdir='in')
ax.legend([bar1,bar2,bar3,bar4],['柱形1','柱形2','柱形3','柱形4'])
plt.show()
具体代码是按照之前的一个教程修改的:绘制正负区分的柱形图[ax.bar()]
欢迎评论或者加我交流,分享更简单的绘制方法~
相关文章:
python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()]
python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()] 效果图如下所示: 就是这个样子,一般比较少见将柱形图从上往下绘制的。可能是会为了更好的展示数据对比结果吧。这里绘图的主要思路如下: 利用ax.twinx()这个函数生成一个新的x轴…...
自定义Task工具,调用系统的IdleHandler方法
1、工具类,调用系统的IdleHandler方法package com.abbi.viewdemo;import android.os.Looper;import android.os.MessageQueue;import java.util.LinkedList;import java.util.Queue;public class DelayTaskDispatcher {private Queue<Task> delayTasks new L…...
生态GEP案例分享
浙江省领导参观德清”两山“平台4月30日上午,浙江省政府参事室一行领导,在德清县副县长陪同下考察当地数据智能运营中心,参观了国内首个县域数字“两山”决策支持平台建设成果。国内生产总值(GDP),是指按国家市场价格计算的一个国…...
企业级信息系统开发学习笔记1.5 初探Spring AOP
文章目录零、本讲学习目标一、Spring AOP(一)AOP基本含义(二)AOP基本作用(三)AOP与OOP对比(四)AOP使用方式(五)AOP基本概念二、提出游吟诗人唱赞歌任务&#…...
Mysql数据库主主从设置
注意:在同一台服务器上部署主从或主主之类的时候,数据库data下有一个auto.cnf里的uuid不能重复。 原则:做同步之前要保证两个数据库数据一致. 锁表操作: FLUSH TABLES WITH READ LOCK; 注:没有锁定主服务器…...
监管持续,医疗卫生机构如何守好“涉疫”数据安全?
肆虐三年的新冠疫情,影响着全球经济发展、社会正常运行,也成为网络攻击、勒索软件攻击快速增长的温床,“滋生”了一系列网络、数据安全问题,受到各界关注。最近,上线运行三年的 “粤康码”发布公告、官宣部分服务下线&…...
STM32开发(13)----获取唯一设备标识符UID
获取唯一设备标识符UID前言一、什么事UID二、实验过程1.CubeMx配置2.代码实现3.实验结果总结前言 这一章节介绍如何获取STM32芯片中的唯一的ID号的两种方法。 一、什么事UID 在许多项目中,识别设备是必要的。从简单的设备描述到更复杂的设备,如 USB 串…...
华为OD机试 - 最优调度策略(Python) | 机试题+算法思路+考点+代码解析 【2023】
最优调度策略 题目 在通信系统中有一个常见的问题是对用户进行不同策略的调度 会得到不同系统消耗的性能 假设由 N 个待串行用户,每个用户可以使用 A/B/C 三种不同的调度策略 不同的策略会消耗不同的系统资源 请你根据如下规则进行用户调度 并返回总的消耗资源数 规则是:相…...
前端零基础入门-002-集成开发环境
本篇目标 了解市面上常用的前端集成开发环境(ide)掌握 HBuiberX 的使用:下载安装,新建项目、网页、运行网页。 内容摘要 本篇介绍了市面上流行的几款前端集成开发环境(ide),并介绍了 Hbuilde…...
su和sudo的区别
linux中 su和sudo的区别 su和sudo是两个常用的切换到root超级用户命令。功能上类似,但使用上还是有不少差异。 su命令 su是切换到root用户的命令,主要用法如下: su:不带参数直接输入su将切换到root用户,需要输入root…...
【ChatGPT】使用ChatGPT进行51单片机程序编程体验
背景 最近ChatGPT大火,笔者尝试使用它进行了51单片机编程尝试。ChatGPT是一种由OpenAI训练的大型语言模型,具有强大的自然语言处理能力和生成代码的能力。 使用ChatGPT进行51单片机编程,笔者发现它可以帮助开发人员快速生成符合要求的代码&a…...
Docker之路(1.Docker概述、组成以及特点)
1.docker为什么会出现? 一款产品或者项目来说,一般有三个环境,日常/测试环境、预发环境、正式/线上环境 这么多环境,对其环境的配置是十分麻烦的,每一个机器都要部署环境,有的会有集群Redis、Hadoop等&…...
非对称加密算法在android的应用
前言android 系统安全内容总结 4、非对称加密算法应用 主要特性包括secure boot、AVB、OTA包签名、apk签名、apex、ko签名; 除此外上层应用keystore服务、涉及TEEOS非对称算法的功能安全会用到。属于功能安全本章节暂不描述。 4.1、secboot+avb secboot+avb属于安全启动参照…...
51单片机——定时器中断实验,小白讲解,相互学习
定时器介绍 1,CPU时序的有关知识 震荡周期:为单片机提供定时信号的震荡源的周期(晶振周期或外加震荡周期)。状态周期:2个震荡周期为1个状态周期,用S表示。震荡周期又称S周期或时钟周期。机器周期ÿ…...
什么是循环依赖,spring是如何去解决循环依赖问题的?什么是三级缓存?【spring】
文章目录什么是循环依赖?什么是三级缓存?执行流程什么是循环依赖? 在我们的开发中,会不可避免的遇到Bean之间循环依赖的,所谓循环依赖,就是两个或者两个以上的Bean互相持有对方,这样在程序运行…...
Cron表达式
网上搜一下就有在线生成网站,很方便。 比如:Cron表达式生成器 用途 定时调度任务,比如说服务器、云函数中定时执行脚本函数。 Cron 表达式构成 Cron 表达式是字符串,一般由 6 - 7 个字段构成,空格分隔。每个字段代…...
JavaScript 作用域
作用域是可访问变量的集合。在JavaScript中,能够定义全局作用域或者局部作用域。在 JavaScript 中, 对象和函数同样也是变量。在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。JavaScript 函数作用域: 作用域在函数内修改。JavaScrip…...
Hive内部表与外部表的区别具体说明
目录 1.在/opt/atguigu/目录下,新建两个txt文件 2.在hadoop的web端递归创建一个目录,存储这两个文件 3.查看web端的文件 一、内部表: 1.创建一个内部表,并指定内部表的存储位置 2.查看内部表,内部表中没有数据 …...
Java流程控制
目录 前言 一、用户交互Scanner及其进阶使用 输入的数据为字符串类型 输入的数据为整型或者浮点型 练习 二、顺序结构 三、选择结构 if单选泽结构 if双选择结构 if多选择结构 嵌套的if结构 switch多选择结构 四、循环结构 while循环 Do...while循环 For循环 练习 利用for循环…...
I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux
bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令,在启动 Linux 内核的时候都会用到一个重要的全局变量:images, images 在文件 cmd/bootm.c 中有如下定义: images 是 bootm_headers_t 类型的全局变量&…...
解锁3大智能功能:League-Toolkit让普通玩家也能玩转专业级游戏分析
解锁3大智能功能:League-Toolkit让普通玩家也能玩转专业级游戏分析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的召…...
【个人推荐】一些好用的录音转写工具
因为助教课备课的缘故,需要录制讲座的音频以整理知识点。一次讲座的音频内容很长,即使3x速快进播放依然很耗费时间,因此录音转写的需求浮现了出来。于是闲暇之余探索了下市面上的录音转写工具,浅浅记录下体验。 下面主要推荐三款…...
Zotero Connector进阶:定制知乎内容抓取与快照/正文模式切换详解
1. 为什么需要定制知乎内容抓取? 作为一款强大的文献管理工具,Zotero在学术论文管理方面表现出色,但在处理知乎这类内容平台时却常常力不从心。我最初使用Zotero Connector抓取知乎内容时,经常遇到只保存了网页快照而无法获取完整…...
EasyAnimateV5-7b-zh-InP在AI艺术创作中的算法优化实践
EasyAnimateV5-7b-zh-InP在AI艺术创作中的算法优化实践 1. 引言 作为一名数字艺术创作者,我一直在寻找能够提升创作效率和质量的技术工具。最近在尝试使用EasyAnimateV5-7b-zh-InP进行艺术创作时,发现这个模型在图像到视频的转换方面表现出色ÿ…...
BilibiliDown:如何高效批量下载B站视频并实现离线收藏管理?
BilibiliDown:如何高效批量下载B站视频并实现离线收藏管理? 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.…...
Visual C++运行库一键修复终极指南:快速解决系统依赖问题
Visual C运行库一键修复终极指南:快速解决系统依赖问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C运行库是Windows系统中不可或缺的组件…...
MAVLink垂直扩展:Emaxx导航板专用协议库设计与实践
1. 项目概述 mavlink_emaxx 是一个面向 Emaxx 导航板(Emaxx Nav Board)定制的 MAVLink 协议消息扩展库。该库并非独立协议栈,而是基于标准 MAVLink v2 协议规范构建的一组专用消息定义(message definitions)与配套 C…...
高效媒体下载全平台解决方案:跨平台资源获取工具深度指南
高效媒体下载全平台解决方案:跨平台资源获取工具深度指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …...
CentOS7下KingbaseES V9与MySQL性能对比实测:从安装到查询优化的全流程体验
CentOS7下KingbaseES V9与MySQL性能对比实测:从安装到查询优化的全流程体验 在国产数据库技术快速发展的今天,越来越多的企业开始关注从传统数据库向国产化解决方案的迁移。作为国产数据库中的佼佼者,KingbaseES V9凭借其出色的MySQL兼容性和…...
90% 的开发者都在错误理解 async/await:协程本质与高并发实战指南
90% 的开发者都在错误理解 async/await:协程本质与高并发实战指南 很多人在第一次写 async def await 的时候,心里都暗暗期待:这下代码应该变快了吧? 结果写完一测,单个接口的响应时间和以前同步写法几乎一模一样&…...
