Python-matplotlib定制化刻度(主副)绘制

2023-11-04 05:30

本文主要是介绍Python-matplotlib定制化刻度(主副)绘制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

公众号后台回复“图书“,了解更多号主新书内容

作者:宁海涛

来源:DataCharm

  • Python-matplotlib 定制化图例绘制

  • Python-双Y轴绘制图表元素完善

  • 双Y轴图例等熟悉添加

Python-matplotlib 定制化图例绘制

本期的推文绘制我们的参考图例来源于以下图表:可以看出:

  1. 图表是双Y轴的绘制

  2. 图表的x轴刻度绘制较为复杂(也是本期的重点内容),如下:

由于没有原始数据,我们使用Python进行虚构,构造的数据预览如下(部分):

data列用于绘制柱形图(bar plot),line_data列用于绘制第二个Y轴的点线图(line plot)

数据处理

通过观察原始图表,我们可以知道,原图的x轴刻度是一年的12个月份,即[2,4,6,8,10,12]的重复,由于较难对刻度进行ticker的编写,这里我们直接采用最粗暴的方法-直接命名刻度label方法进行操作,构建方式如下:

tick_label = ['',"2",'','4','','6','','8','','10','','12']*4

这里我是虚构的4年数据哈,而使用‘’用于替代不显示的[1,3,5,7,9,11]的刻度位置,接下来我们直接绘图。

初步绘图探索

要想绘制该类刻度形式,我们就需要灵活操作主(major)、副(minor)刻度范围及刻度label,绘图代码如下:

from matplotlib.pyplot import MultipleLocatorplt.rcParams['font.family'] = "Times New Roman"
x = np.arange(len(data_all_df))fig,ax = plt.subplots(figsize=(9,5),dpi=100)
bar_plot = ax.bar(x,data_all_df["data"].values,color="gray",width=.5)
#定制化操作
#设置轴范围
ax.set_ylim(bottom=-30,top=300)
ax.set_xlim(left=-.7,right=47.7)
ax.set_xticks(x) #设置这一步操作,要不然刻度往左移
ax.spines["top"].set_visible(False)
#设置x轴刻度label
ax.set_xticklabels(tick_label)#设置主副刻度
#把x轴的主刻度间隔设置为.5,并存在变量里
x_major_locator=MultipleLocator(1)
#把x轴的副刻度间隔设置为.5,并存在变量里
x_minor_locator=MultipleLocator(.5)
#调用刻度设置
ax.xaxis.set_minor_locator(x_minor_locator)
ax.xaxis.set_major_locator(x_major_locator)ax.tick_params(axis='y',direction='in',labelsize=8,length=3.5)
ax.tick_params(axis='x',which="major",direction='in',bottom=False,labelsize=8,length=3,width=.4)
#定制化副刻度ax.tick_params(axis="x",which="minor",direction="out",length=10,width=.4)
#设置刻度轴脊的位置:较重要的方法
ax.spines['bottom'].set_position(('data', 0))

知识点:

  1. 设置主副刻度

x_major_locator=MultipleLocator(1)
#把x轴的副刻度间隔设置为.5,并存在变量里
x_minor_locator=MultipleLocator(.5)
#调用刻度设置
ax.xaxis.set_minor_locator(x_minor_locator)
ax.xaxis.set_major_locator(x_major_locator)
  1. 刻度形式操作

ax.tick_params(axis='y',direction='in',labelsize=8,length=3.5)
ax.tick_params(axis='x',which="major",direction='in',bottom=False,labelsize=8,length=3,width=.4)
ax.tick_params(axis="x",which="minor",direction="out",length=10,width=.4)
  1. 设置刻度轴脊的位置:较重要的方法

ax.spines['bottom'].set_position(('data', 0))

可视化结果如下:我们可以发现,图中的刻度已经蛮符合胡子hi要求了(如下):但是当我继续想添加年份的分割刻度时,已这种方式为基础的绘图将很难实现,最终我们选择直接主刻度定义年份,副刻度定义月份的操作,通过对其定制化操作,达到我们的绘图需求。

绘图完善

这里我们直接给出代码,如下:

from matplotlib.pyplot import MultipleLocator
import matplotlib.ticker as ticker
plt.rcParams['font.family'] = "Times New Roman"x = np.arange(len(data_all_df))
fig,ax = plt.subplots(figsize=(9,5),dpi=100)
bar_plot = ax.bar(x,data_all_df["data"].values,color="gray",width=.5,label="Bar Charts",zorder=2)
#定制化操作
ax.set_ylabel("Bar_Data_Value",size=12)
ax.set_xlabel("Month",size=12,labelpad=15)
#ax.set_xlabel()
ax.set_ylim(bottom=0,top=300)
ax.set_xlim(left=-.5,right=47.5)
#设置主刻度
ax.set_xticks(np.arange(-.5, 48.5, step=12)) #设置这一步操作,要不然刻度往左移
#设置副刻度
ax.set_xticks(np.arange(0, 48, step=1),minor=True)ax.spines["top"].set_visible(False)
#设置副刻度label
ax.set_xticklabels(tick_label,minor=True)
#添加 年数文本作为X轴信息
for i,text in zip([.125,.375,.625,.875],['2014','2015','2016','2017']):ax.text(i,-.08,text,transform = ax.transAxes,va="center",ha="center",fontweight="bold")
#或者如下操作设置主刻度
# positions = [-.5,11.5,23.5,35.5,47.5]
# ax.xaxis.set_major_locator(ticker.FixedLocator(positions))#添加双y轴:使用Axes.twinx()方法绘制
second_plot = ax.twinx()
#注意:这里必须要有, 后面的图例才可以生成
line_plot, = second_plot.plot(np.arange(len(data_all_df)),data_all_df["line_data"].values,"-D",ms=4,c="k",lw=.9,label="Line Charts")
second_plot.set_ylim((0,10000))
second_plot.tick_params(axis='y',direction='in',labelsize=10,length=3.5)
second_plot.set_ylabel("Line_Data_Value",size=12)
second_plot.set_axisbelow(True)
second_plot.spines["top"].set_visible(False)
ax.tick_params(axis='y',direction='in',labelsize=10,length=3.5)
ax.tick_params(axis='x',which="major",direction='out',labelbottom=False,length=25,width=.5)
ax.tick_params(axis="x",which="minor",bottom=False,direction="out",length=3,width=.4,pad=.01)
ax.set_axisbelow(True)# #添加图例
charts = [bar_plot, line_plot]
ax.legend(charts, [l.get_label() for l in charts],frameon=False)plt.savefig(r'\double_y_axis_plot_excise.png',width=7,height=3,dpi=900,bbox_inches='tight',facecolor='white')

知识点:

  1. 定义刻度位置及间隔

#设置主刻度
ax.set_xticks(np.arange(-.5, 48.5, step=12)) 
#设置副刻度
ax.set_xticks(np.arange(0, 48, step=1),minor=True)
  1. 使用Axes.twinx()添加双轴

second_plot = ax.twinx()
#注意:这里必须要有, 后面的图例才可以生成
line_plot, = second_plot.plot(np.arange(len(data_all_df)),data_all_df["line_data"].values,"-D",ms=4,c="k",lw=.9,label="Line Charts")

注意:这里必须要有, 后面的图例才可以生成3. 定制年份的刻度label文本

#添加 年数文本作为X轴信息
for i,text in zip([.125,.375,.625,.875],['2014','2015','2016','2017']):ax.text(i,-.08,text,transform = ax.transAxes,va="center",ha="center",fontweight="bold")
  1. 双Y轴图例添加

# #添加图例
charts = [bar_plot, line_plot]
ax.legend(charts, [l.get_label() for l in charts],frameon=False)

4.其他如刻度起始、间隔等设置大家可参考具体代码,根据自己需求进行修改。

最终我们的可视化结果如下:

◆ ◆ ◆  ◆ ◆麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行100-50活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗



这篇关于Python-matplotlib定制化刻度(主副)绘制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/343564

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核