Python实现双X轴双Y轴绘图
诈尸人口回归。这一年忙着灌水忙到头都掉了,最近在女朋友的提醒下终于想起来博客的账号密码,正好今天灌水的时候需要画一个双X轴双Y轴的图,研究了两小时终于用Py实现了。找资料的过程中没有发现有系统的文章,反正代码都整理出来了,我决定顺势水一篇。
目前找到的plt实现双X轴双Y轴绘图方式有两种:
- 使用
fig.add_subplot方式将两对坐标系叠加在一个fig上实现双X轴双Y轴效果。所有调整均可完美实现,推荐该方式 - 通过
axes.twinx().twiny()方式实现双X轴双Y轴图形绘制。问题在于对于第二个Y轴的各种设置无效,label可以通过手动添加的方式创建并指定颜色,而tick颜色则无法修改。可能需要等待官方修复,或者尝试先使用ax1=axes.twinx()方式,从ax1中获取第二个Y轴,然后再使用ax2.twiny()创建第二个X轴。
fig.add_subplot 方式实现双X轴双Y轴绘图
"""
使用plt,通过fig.add_subplot方式将两对坐标系叠加在一个fig上实现双X轴双Y轴效果。
所有调整均可完美实现,推荐该方式
"""
import matplotlib.pyplot as plt
import numpy as np
"""生成数据并设置绘图参数"""
x = np.arange(1, 12, 4)
y = np.arange(1, 4, 1)
x2=x*10
y2=y**2
# 设置两种绘图颜色
c1='r'
c2='b'
# 设置字体大小
fontsize=12
# 设置画布大小
width,height=16,14 # 单位为cm;因为保存图片时使用 bbox_inches = 'tight' 可能使图片尺寸略微放大,所以此处宽度设置得略小
# 设置刻度线在坐标轴内
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
"""绘图"""
lns=[] # 用于存储绘图句柄以合并图例的list
# 创建画布并设置大小
fig=plt.figure()
fig.set_size_inches(width/2.54, height/2.54) # 因为画布输入大小为厘米,此处需转换为英寸,所以除以2.54
# 通过 add_subplot 方式创建两个坐标轴,相当于在同一个子图上叠加了两对坐标系
ax=fig.add_subplot(111, label="1")
ax2=fig.add_subplot(111, label="2", frame_on=False)
# 绘制图1并将绘图句柄返回,以便添加合并图例
lns1=ax.plot(x,y,color=c1,label=c1)
lns=lns1
lns2=ax2.plot(x2,y2, color=c2,label=c2)
lns+=lns2
"""图形美化"""
# 调整第二对坐标轴的label和tick位置,以实现双X轴双Y轴效果
ax2.xaxis.tick_top()
ax2.yaxis.tick_right()
ax2.xaxis.set_label_position('top')
ax2.yaxis.set_label_position('right')
# 设置坐标轴标注
ax.set_xlabel("X1", color=c1,fontsize=fontsize)
ax.set_ylabel("Y1", color=c1,fontsize=fontsize)
ax2.set_xlabel('X2', color=c2,fontsize=fontsize)
ax2.set_ylabel('Y2', color=c2,fontsize=fontsize)
# 设置图表标题
fig.suptitle("Title",fontsize=fontsize+2)
# 设置坐标轴刻度颜色
ax.tick_params(axis='x', colors=c1)
ax.tick_params(axis='y', colors=c1)
ax2.tick_params(axis='x', colors=c2)
ax2.tick_params(axis='y', colors=c2)
# 设置坐标轴线颜色
ax.spines["left"].set_color("r") # 修改左侧颜色
ax.spines["right"].set_color("b") # 修改右侧颜色
ax.spines["top"].set_color("b") # 修改上边颜色
ax.spines["bottom"].set_color("r") # 修改下边颜色
# 添加图例
labs = [l.get_label() for l in lns]
ax.legend(lns, labs, loc=0,fontsize=fontsize)
plt.tight_layout()
plt.show()

使用 axes.twinx().twiny() 方式实现双X轴双Y轴绘图
"""
使用plt,通过 axes.twinx().twiny() 方式实现双X轴双Y轴图形绘制。
问题在于对于第二个Y轴的各种设置无效,label可以通过手动添加的方式创建并指定颜色,而tick颜色则无法修改
"""
import matplotlib.pyplot as plt
import numpy as np
"""生成数据并设置绘图参数"""
x = np.arange(1, 12, 4)
y = np.arange(1, 4, 1)
x2=x*10
y2=y**2
# 设置两种绘图颜色
c1='r'
c2='b'
# 设置字体大小
fontsize=12
# 设置刻度线在坐标轴内
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
"""绘图"""
lns=[] # 用于存储绘图句柄以合并图例的list
# 创建画布
fig,axes=plt.subplots()
fig.set_size_inches(10, 8)
# 绘制图1并将绘图句柄返回,以便添加合并图例
lns1=axes.plot(x,y,color=c1,label=c1)
lns=lns1
# 创建双x轴双y轴
twin_axes=axes.twinx().twiny() # 使用画布的初始坐标轴对象创建第二对坐标轴,类似于在双x轴的基础上叠加双y轴
# 绘制图2并将绘图句柄返回,以便添加合并图例
lns2=twin_axes.plot(x2,y2,color=c2,label=c2)
lns+=lns2
"""图形美化"""
# 设置坐标轴标注
axes.set_xlabel("X1",color=c1, fontsize=fontsize)
axes.set_ylabel("Y1",color=c1, fontsize=fontsize)
twin_axes.set_xlabel("X2",color=c2, fontsize=fontsize)
twin_axes.set_ylabel("Y2",color=c2, fontsize=fontsize) # 第二个y轴设置标注无效
# 设置图表标题
fig.suptitle("Title",fontsize=fontsize+2)
# 设置第二个y轴的label;由于set_ylabel无效,因此只能通过该种方式手动添加
loc_text_x=np.min(plt.xlim())+np.ptp(plt.xlim())*1.03
loc_text_y=np.min(plt.ylim())+np.ptp(plt.ylim())*0.5
str_text='Y2'
twin_axes.text(loc_text_x, loc_text_y, str_text,rotation=90,color=c2,fontsize=fontsize)
# 设置坐标轴刻度颜色
axes.tick_params('x', colors=c1)
axes.tick_params('y', colors=c1)
twin_axes.tick_params('x', colors=c2)
twin_axes.tick_params('y', colors=c2)
# 设置坐标轴线颜色
twin_axes.spines["left"].set_color("r") # 修改左侧颜色
twin_axes.spines["right"].set_color("b") # 修改右侧颜色;同第二个y轴的label设置一样,该设置也不起作用
twin_axes.spines["top"].set_color("b") # 修改上边颜色
twin_axes.spines["bottom"].set_color("r") # 修改下边颜色
# 添加图例
# lns = lns1+lns2
labs = [l.get_label() for l in lns]
axes.legend(lns, labs, loc=0,fontsize=fontsize)
plt.tight_layout()
plt.show()
本文参考:
- matplotlib using twinx and twiny together (like twinxy)
- twinx and twiny in Matplotlib
- matplotlib 双y轴绘制及合并图例
- Python matplotlib怎么画双X轴和双Y轴
Python实现双X轴双Y轴绘图的更多相关文章
- R par yaxp xaxp 显示x轴和y轴的刻度线
R语言会自动根据数据的范围,在X轴和Y轴上标记合适的刻度 > options(scipen = ) > plot(sample(:, )) 生成的图片如下 通过par("yaxp ...
- par函数的las参数-控制x轴和y轴标签的方向
las 参数控制x轴和y轴的刻度线上的标签与两条轴的防线,可选值为0,1,2,3 0为默认值,代表始终与刻度线平行,代码示例: par(las = 0) plot(1:5, 1:5, main = & ...
- Highcharts 丢失值区域图;Highcharts 反转x轴与y轴;Highcharts 曲线区域图;Highcharts 区间区域图;Highcharts 使用区间和线的区域图
Highcharts 丢失值区域图 chart 配置 将 chart 的 spacingBottom 属性设置为 30.表示图表间的间隔区间. var chart = { type: 'area', ...
- Hdu 5862 Counting Intersections(有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点+树状数组区间求和单点跟新)
传送门:Hdu 5862 Counting Intersections 题意:有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点 分析: 基本的操作流程是:先将所有的线段按照横树坐标x按小的 ...
- ECharts的x轴和y轴均使用数值类型
今天有个需求,就是需要ECharts的x轴和y轴都要使用数值类型,即xAxis.type和yAxis.type均为value,然后我按照我以为的方式修改了下,发现图崩了 发现问题: 然后我打开了ECh ...
- 统制Highcharts中x轴和y轴坐标值的密度
统制Highcharts中x轴和y轴坐标值的密度 www.MyException.Cn 发布于:2012-06-26 10:04:13 浏览:688次 1 控制Highcharts中x轴和y轴坐标值的 ...
- WInform中实现设置ZedGraph中曲线的X轴与Y轴的上限与下限
场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- Winform中设置ZedGraph鼠标悬浮显示举例最近曲线上的点的坐标值和X轴与Y轴的标题
场景 Winform中设置ZedGraph鼠标双击获取距离最近曲线上的点的坐标值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...
- Winform中设置ZedGraph的X轴与Y轴的刻度不在对面显示
场景 C#窗体应用中使用ZedGraph曲线插件绘制图表: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99716066 Win ...
- echart-如何将x轴和y轴的原点进行重合???
设计稿突然让x轴 和y轴重合,我们可以设置图中的这个属性. 不知道还有没有别的设置属性,欢迎评论指出谢谢
随机推荐
- libpcap -学习1
1.今天学到的最重要一点就是指定是否打开混杂模式(Promiscuous Mode),0表示非混杂模式,任何其他值表示混合模式.如果要打开混杂模式,那么网卡必须也要打开混杂模式,可以使用如下的命令打开 ...
- 如何处理异形屏iphone X?
safe area: 默认放置在安全区域以避免遮挡, 但会压缩 在meta中添加viewport-fit=cover: 告诉浏览器要讲整个页面渲染到浏览器中,不管设备是圆角与否,这个时候会造成页面的元 ...
- 如何实现 Spring Boot 应用程序的安全性?
为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置.它只需要很少的代码.配置类将必须扩展WebSecurity ...
- String 是最基本的数据类型吗?
不是. Java中基本数据类型只有8个:byte.short.int.long.float.double.char.boolean:除了基本类型(primitive type),剩下都是引用类型(re ...
- yarn上运行flink环境搭建
主要完成hadoop集群搭建和yarn上运行flink 1.搭建hadoop伪集群 主要是搭建hadoop MapReduce(yarn)和HDFS 1.1 下载&配置环境变量 这里下载的ha ...
- Dubbo 集群容错有几种方案?
集群容错方案 说明 Failover Cluster 失败自动切换,自动重试其它服务器(默认) Failfast Cluster 快速失败,立即报错,只发起一次调用 Failsafe Cluster ...
- 学习Docker(二)
一.Docker快速入门 Docker 改变了什么? 1.简化配置 2.流水线管理 3.应用隔离 4.提高开发效率 5.快速部署 6.面向产品:产品交付 7.面向开发:简化环境配置 8.面向测试:多版 ...
- Spring的@Enable*注解的工作原理
转自:https://blog.csdn.net/chengqiuming/article/details/81586948 一 列举几个@Enable*注解的功能 @EnableAspectJAut ...
- 百度移动统计调用api教程,少进坑(82001错误)
相信很多小伙伴使用了百度统计,来查看自己应用使用的情况,但是会发现百度移动统计在官网没有api调用取数据的接口, 现在我就以自己成功调用api并且成功拿到数据,将这个步骤给大家参考,(末尾有调用移动统 ...
- devicePixelRatio 那些事儿
devicePixelRatio 那些事儿 设备像素比 window.devicePixelRatio 是设备上物理像素和设备独立像素的比例,即公式表示为:window.devicePixelRati ...
