当前位置: 首页 > news >正文

python画图|自制渐变柱状图

在前述学习过程中,我们已经通过官网学习了如何绘制渐变的柱状图及其背景。

掌握一门技能的最佳检验方式就是通过实战,因此,本文尝试做一些渐变设计。

前述学习记录可查看链接:

Python画图|渐变背景-CSDN博客

 【1】柱状图渐变

在上一篇文章中,由于代码太长,对单个函数的解读不够详细,在本文中可以详细展开。

首先将背景渐变的代码改为注释,原因为:

【a】所有渐变都使用了gradient_image()函数;

【b】gradient_bar()函数通过调用gradient_image()函数画出了渐变的柱状图;

【c】调用gradient_image()函数单独定义了背景渐变。

因此,在不对代码进行修改的前提下,最快速的更改就是把背景渐变的代码消除:

# background image
#gradient_image(ax, direction=1, extent=(0, 1, 0, 1), transform=ax.transAxes,#cmap=plt.cm.RdYlGn, cmap_range=(0.2, 0.9), alpha=0.5) #调用了子函数

此时的输出结果为:

图1

由图1可见,坐标轴区域内部已经改为纯色,仅柱状图变成渐变颜色。

然后尝试修改颜色,将柱状图的渐变色改为cmap由plt.cm.Blues_r改为plt.cm.Blues,此时的输出结果为:

图2

对比图1和图2可见,渐变的方向进行了交换。

【2】渐变代码解读

经过追溯, gradient_bar()函数和gradient_image()函数的构造和使用基本上都参考了ax.imshow()函数。

【2.1】ax.imshow()函数

因,在实施渐变以前,有必要先学习ax.imshow()函数:

https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.imshow.html#matplotlib.axes.Axes.imshow

Axes.imshow(X, cmap=None, norm=None, *, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, interpolation_stage=None, filternorm=True, filterrad=4.0, resample=None, url=None, data=None, **kwargs)

ax.imshow()包含参数意义如下:

X:画图数据依据

cmap:颜色参数

norm:标准化工具,将cmap数据缩放到(0,1)范围

aspect:设定坐标轴的长宽比

interpolation:插值设置

alpha:透明度设置

origin:设定数组的起点在左下角还是左上角

extent:边界框

interpolation_stage:插值范围

filternorm:图像粒度调整

filterrad=与差值先关

其余如resample、url、data=None和**kwargs不常用,暂无需关注。

【2.2】gradient_bar()函数

基于此,我们尝试解读下述代码:

def gradient_bar(ax, x, y, width=0.5, bottom=0): #自定义函数for left, top in zip(x, y):right = left + width #右边等于左边加宽度,这是要逐个排列的意思gradient_image(ax, extent=(left, right, bottom, top),cmap=plt.cm.Blues##, cmap_range=(0.2, 0.9)

第一行:

def gradient_bar(ax, x, y, width=0.5, bottom=0): #自定义函数

其中的ax,x,y均为外部输入变量, width=0.5, bottom=0为内部已经完成定义的变量。

for函数对x和y组成的组合数组进行取值。

right是内部变量,left+width代表着柱状图不断右移。

gradient_image()函数在此处被直接调用,调用的时候只需要外部输入ax,其余参数如extent、cmap和cmap_range都已经提前完成了赋值。

【2.3】gradient_image()函数

基于前述分析,我们尝试解读下述代码:

# background image
gradient_image(ax, direction=1, extent=(0, 1, 0, 1), transform=ax.transAxes,cmap=plt.cm.RdYlGn, cmap_range=(0.2, 0.9), alpha=0.5) #调用了子函数

这里是对gradient_image()函数的直接调用,几乎所有参数都已经解读过,稍有变化的是里面多了一个transform参数,这里的transform=ax.transAxes就是把ax值转化为Axes值 ,顺直坐标轴画直方图的意思。

【3】渐变调控

根据前述分析已经知晓,柱状图渐变和背景渐变可以分别设置,因此,此处尝试消除柱状图渐变,然后恢复背景渐变。

【3.1】柱状图渐变

消除柱状图渐变,最快的方式是将cmap_range的赋值改成一致的即可:

def gradient_bar(ax, x, y, width=0.5, bottom=0): #自定义函数for left, top in zip(x, y):right = left + width #右边等于左边加宽度,这是要逐个排列的意思gradient_image(ax, extent=(left, right, bottom, top),cmap=plt.cm.Blues, cmap_range=(0.8, 0.8))

此时的输出图像为:

图3

【3.2】背景渐变

消除背景图渐变,最快的方式也是将cmap_range的赋值改成一致的即可:

# background image
gradient_image(ax, direction=1, extent=(0,1,0, 1), transform=ax.transAxes,cmap=plt.cm.RdYlGn, cmap_range=(0.9, 0.9), alpha=0.5) #调用了子函数

 此时的输出图像为:

图4

至此,所有渐变已经消除。

至此的完整代码为:

import matplotlib.pyplot as plt  # 引入matplotlib模块画图
import numpy as np  # 引入numpy模块做数学计算np.random.seed(19680801) #定义随机数种子def gradient_image(ax, direction=0.3, cmap_range=(0, 1), **kwargs): #自定义函数"""Draw a gradient image based on a colormap.Parameters----------ax : AxesThe Axes to draw on.direction : floatThe direction of the gradient. This is a number inrange 0 (=vertical) to 1 (=horizontal).cmap_range : float, floatThe fraction (cmin, cmax) of the colormap that should beused for the gradient, where the complete colormap is (0, 1).**kwargsOther parameters are passed on to `.Axes.imshow()`.In particular, *cmap*, *extent*, and *transform* may be useful."""phi = direction * np.pi / 2 #定义因变量,从np.pi可以看出这是一个角度变量v = np.array([np.cos(phi), np.sin(phi)]) #定义数组,包括正弦值和余弦值X = np.array([[v @ [1, 0], v @ [1, 1]],[v @ [0, 0], v @ [0, 1]]]) #这里的@是矩阵乘法a, b = cmap_range #定义变量a和bX = a + (b - a) / X.max() * X #定义变量Xim = ax.imshow(X, interpolation='bicubic', clim=(0, 1),aspect='auto', **kwargs) #定义变量imreturn im #返回imdef gradient_bar(ax, x, y, width=0.5, bottom=0): #自定义函数for left, top in zip(x, y):right = left + width #右边等于左边加宽度,这是要逐个排列的意思gradient_image(ax, extent=(left, right, bottom, top),cmap=plt.cm.Blues, cmap_range=(0.8, 0.8))fig, ax = plt.subplots()
ax.set(xlim=(0, 10), ylim=(0, 1))# background image
gradient_image(ax, direction=1, extent=(0,1,0, 1), transform=ax.transAxes,cmap=plt.cm.RdYlGn, cmap_range=(0.9, 0.9), alpha=0.5) #调用了子函数N = 10 #定义常量10
x = np.arange(N) + 0.15 #使用随机变量参与运算制造变量x
y = np.random.rand(N) #定义随机矩阵
gradient_bar(ax, x, y, width=0.7) #画随机柱状图
plt.show() #输出图形

【4】坐标轴外背景颜色设置

在前述学习过程中,已经讨论了坐标轴以外的颜色设置,详见下述链接:

python画图|图像背景颜色设置-CSDN博客

此处的渐变仅仅涉及坐标轴内部区域和柱状图本身,基于此,尝试设置坐标轴外部的颜色,修改画图代码为:

fig, ax = plt.subplots(facecolor=(0.6, 0.5,0.9))

此时的输出结果为:

图5

由图5可见,外部背景、坐标轴内都有了颜色。

此时的完整代码为:

import matplotlib.pyplot as plt  # 引入matplotlib模块画图
import numpy as np  # 引入numpy模块做数学计算np.random.seed(19680801) #定义随机数种子def gradient_image(ax, direction=0.3, cmap_range=(0, 1), **kwargs): #自定义函数"""Draw a gradient image based on a colormap.Parameters----------ax : AxesThe Axes to draw on.direction : floatThe direction of the gradient. This is a number inrange 0 (=vertical) to 1 (=horizontal).cmap_range : float, floatThe fraction (cmin, cmax) of the colormap that should beused for the gradient, where the complete colormap is (0, 1).**kwargsOther parameters are passed on to `.Axes.imshow()`.In particular, *cmap*, *extent*, and *transform* may be useful."""phi = direction * np.pi / 2 #定义因变量,从np.pi可以看出这是一个角度变量v = np.array([np.cos(phi), np.sin(phi)]) #定义数组,包括正弦值和余弦值X = np.array([[v @ [1, 0], v @ [1, 1]],[v @ [0, 0], v @ [0, 1]]]) #这里的@是矩阵乘法a, b = cmap_range #定义变量a和bX = a + (b - a) / X.max() * X #定义变量Xim = ax.imshow(X, interpolation='bicubic', clim=(0, 1),aspect='auto', **kwargs) #定义变量imreturn im #返回imdef gradient_bar(ax, x, y, width=0.5, bottom=0): #自定义函数for left, top in zip(x, y):right = left + width #右边等于左边加宽度,这是要逐个排列的意思gradient_image(ax, extent=(left, right, bottom, top),cmap=plt.cm.Blues, cmap_range=(0.8, 0.8))fig, ax = plt.subplots(facecolor=(0.6, 0.5,0.9)) #设置坐标轴外区域颜色
ax.set(xlim=(0, 10), ylim=(0, 1))# background image
gradient_image(ax, direction=1, extent=(0,1,0, 1), transform=ax.transAxes,cmap=plt.cm.RdYlGn, cmap_range=(0.9, 0.9), alpha=0.5) #调用了子函数N = 10 #定义常量10
x = np.arange(N) + 0.15 #使用随机变量参与运算制造变量x
y = np.random.rand(N) #定义随机矩阵
gradient_bar(ax, x, y, width=0.7) #画随机柱状图
plt.show() #输出图形

【5】自主渐变设置

在前述学习的基础上,给所有区域山上色,并对坐标轴内部区域进行渐变设置,并设置图名为“Gradient Color”。

完整代码为:

import matplotlib.pyplot as plt  # 引入matplotlib模块画图
import numpy as np  # 引入numpy模块做数学计算np.random.seed(19680801) #定义随机数种子def gradient_image(ax, direction=0.3, cmap_range=(0, 1), **kwargs): #自定义函数"""Draw a gradient image based on a colormap.Parameters----------ax : AxesThe Axes to draw on.direction : floatThe direction of the gradient. This is a number inrange 0 (=vertical) to 1 (=horizontal).cmap_range : float, floatThe fraction (cmin, cmax) of the colormap that should beused for the gradient, where the complete colormap is (0, 1).**kwargsOther parameters are passed on to `.Axes.imshow()`.In particular, *cmap*, *extent*, and *transform* may be useful."""phi = direction * np.pi / 2 #定义因变量,从np.pi可以看出这是一个角度变量v = np.array([np.cos(phi), np.sin(phi)]) #定义数组,包括正弦值和余弦值X = np.array([[v @ [1, 0], v @ [1, 1]],[v @ [0, 0], v @ [0, 1]]]) #这里的@是矩阵乘法a, b = cmap_range #定义变量a和bX = a + (b - a) / X.max() * X #定义变量Xim = ax.imshow(X, interpolation='bicubic', clim=(0, 1),aspect='auto', **kwargs) #定义变量imreturn im #返回imdef gradient_bar(ax, x, y, width=0.5, bottom=0): #自定义函数for left, top in zip(x, y):right = left + width #右边等于左边加宽度,这是要逐个排列的意思gradient_image(ax, extent=(left, right, bottom, top),cmap=plt.cm.Blues, cmap_range=(0.2, 0.8))fig, ax = plt.subplots(facecolor=(0.6, 0.5,0.9)) #设置坐标轴外区域颜色
ax.set(xlim=(0, 10), ylim=(0, 1))# background image
gradient_image(ax, direction=1, extent=(0,1,0, 1), transform=ax.transAxes,cmap=plt.cm.RdYlGn, cmap_range=(0.1, 0.9), alpha=0.5) #调用了子函数N = 10 #定义常量10
x = np.arange(N) + 0.15 #使用随机变量参与运算制造变量x
y = np.random.rand(N) #定义随机矩阵
gradient_bar(ax, x, y, width=0.7) #画随机柱状图
ax.set_title('Gradient Color') #设置图名
plt.show() #输出图形

输出图形为:

图6

由图6可见,坐标轴内部的柱状图和背景颜色均渐变,坐标轴外的区域则是纯色。

【6】总结

学习了柱状图、坐标轴区域内部背景颜色的渐变设计,以及为坐标轴外部区域增添颜色。

相关文章:

python画图|自制渐变柱状图

在前述学习过程中,我们已经通过官网学习了如何绘制渐变的柱状图及其背景。 掌握一门技能的最佳检验方式就是通过实战,因此,本文尝试做一些渐变设计。 前述学习记录可查看链接: Python画图|渐变背景-CSDN博客 【1】柱状图渐变 …...

基于RPA+BERT的文档辅助“悦读”系统 | OPENAIGC开发者大赛高校组AI创作力奖

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...

K8S部署流程

一、war打包镜像(survey,analytics,trac系统) 代码打包成war准备tomcat的server.xml文件&#xff0c;修改connector中8080端口为项目的端口 修改前&#xff1a; <Connector port"8080" protocol"HTTP/1.1"connectionTimeout"20000"redirect…...

DevExpress WinForms中文教程:Data Grid - 如何添加或删除行?

本教程介绍DevExpress WinForm的Data Grid控件UI元素和API&#xff0c;它们使您和最终用户能够添加或删除数据行。您将首选学习如何启用内置的数据导航器&#xff0c;然后学习如何使用Microsoft Outlook启发的New Item行添加新记录。最后教程将向您展示基本的API&#xff0c;它…...

u盘格式化后数据能恢复吗?2024年Top4恢复神器来帮忙

在这个电脑和手机满天飞的时代&#xff0c;U盘是我们用来存东西和传文件的得力助手&#xff0c;特别重要。但是&#xff0c;有时候U盘可能会不小心被格式化了&#xff0c;里面的重要文件就不见了。那么&#xff0c;U盘格式化后的数据还能恢复吗&#xff1f;当然可以。今天会告诉…...

深度学习·Argparse

Argparse 命令行选项、参数和子命令解析器 ArgumentParser 命令行传参数->解析参数->获得对应参数 初始化&#xff1a;parser argparse.ArgumentParser(descriptionxxx)添加命令行参数&#xff1a; parser.add_argument("--training_filepath", typestr, he…...

制造企业为何需要PLM系统?PLM系统解决方案对制造业重要性分析

制造企业为何需要PLM系统&#xff1f;PLM系统解决方案对制造业重要性分析 新华社9月23日消息&#xff0c;据全国组织机构统一社会信用代码数据服务中心统计&#xff0c;我国制造业企业总量突破600万家。数据显示&#xff0c;2024年1至8月&#xff0c;我国制造业企业数量呈现稳…...

http协议中的header详细讲解

http协议中的header详细讲解 HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同&#xff0c;用于客户端和服务器之间的通信。 请求访问文本或图像等资源的一端称为客户端&#xff0c;而提供资源响应的一端称为服务器端。 HTTP 协议规定&#xff0c;请求从客户端发出&#xf…...

探索后量子安全:基于格加密技术的未来密码学展望

在信息技术日新月异的今天&#xff0c;量子计算作为下一代计算技术的代表&#xff0c;正逐步从理论走向实践。量子计算的出现对现有的加密体系构成了严重威胁&#xff0c;尤其是基于大数分解和离散对数难题的传统密码学&#xff08;如RSA和Diffie-Hellman协议&#xff09;。为了…...

WPF之UI进阶--完整了解wpf的控件和布局容器及应用

前面三篇有关WPF的基础介绍&#xff0c;分别介绍了wpf与winform的异同&#xff0c;wpf的事件生成和使用以及数据绑定。但我们还缺乏一副好的“皮囊”&#xff0c;所以从这篇开始我们来开始学习wpf的UI相关的内容&#xff0c;首当其冲的就是布局容器。 其实我们知道&#xff0c;…...

unity一键注释日志和反注释日志

开发背景&#xff1a;游戏中日志也是很大的开销&#xff0c;虽然有些日志不打印但是毕竟有字符串的开销&#xff0c;甚至有字符串拼接的开销&#xff0c;有些还有装箱和拆箱的开销&#xff0c;比如Debug.Log(1) 这种 因此需要注释掉&#xff0c;当然还需要提供反注释的功能&am…...

VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

甄选范文“论软件需求管理”,软考高级论文,系统架构设计师论文

论文真题 软件需求管理是一个对系统需求变更了解和控制的过程。需求管理过程与需求开发过程相互关联,初始需求导出的同时就要形成需求管理规划,一旦启动了软件开发过程,需求管理活动就紧密相伴。 需求管理过程中主要包含变更控制、版本控制、需求跟踪和需求状态跟踪等4项活…...

Android Studio Dolphin 中Gradle下载慢的解决方法

我用的版本Android Studio Dolphin | 2021.3.1 Patch 1 1.Gradle自身的版本下载慢 解决办法&#xff1a;修改gradle\wrapper\gradle-wrapper.properties中的distributionUrl 将https\://services.gradle.org/distributions为https\://mirrors.cloud.tencent.com/gradle dis…...

Excel实现省-市-区/县级联

数据准备 准备省份-城市映射数据&#xff0c;如下&#xff1a; 新建sheet页&#xff0c;命名为&#xff1a;省-市数据源&#xff0c;然后准备数据&#xff0c;如下所示&#xff1a; 准备城市-区|县映射数据&#xff0c;如下&#xff1a; 新建sheet页&#xff0c;命名为&#x…...

【优化代码结构】函数的参数归一化

某些封装的函数&#xff0c;其参数具有多样性&#xff0c;会导致函数中会增加非常多的分支&#xff0c;比如下面这个 format 函数有如下几种参数方式&#xff0c;其中 formatter 会有很多种情况 date&#xff1a;日期对象formatter&#xff1a; ‘date’&#xff1a;格式化日期…...

CSS中height设置100vh和100%的区别

文章目录 CSS中height设置100vh和100%的区别一、引言二、高度设置的区别1、100%1.1、父元素高度固定1.2、父元素高度未定义 2、100vh2.1、视口高度2.2、不受父元素限制 三、总结 CSS中height设置100vh和100%的区别 一、引言 在前端开发中&#xff0c;我们经常需要设置元素的高…...

红米k60至尊版工程固件 MTK芯片 资源预览 刷写说明 与nv损坏修复去除电阻图示

红米k60至尊版机型代码为:corot。 搭载了联发科天玑9200+处理器。此固件mtk引导为MT6985。博文将简单说明此固件的一些特点与刷写注意事项。对于NV损坏的机型。展示修改校验电阻的图示。方便改写参数等 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2…...

QEMU使用Qemu-Guest-Agent传输文件、执行指令等

简介 之前介绍过qemu传输文件&#xff0c;使用的挂载 / samba方式 &#xff1a;Qemu和宿主机不使用外网进行文件传输。 这是一种方式&#xff0c;这里还有另一种方式&#xff1a;使用Qemu-Guest-Agent&#xff0c;后面简称qga。 官网介绍&#xff1a;https://www.qemu.org/d…...

【漏洞复现】金和OA C6 GeneralXmlhttpPage.aspx Sql注入漏洞

免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...