当前位置: 首页 > 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注入漏洞

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

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...