当前位置:网站首页>可视化常见问题解决方案(八)共享绘图区域问题解决方案
可视化常见问题解决方案(八)共享绘图区域问题解决方案
2022-04-23 06:17:00 【小猪猪家的大猪猪】
共享绘图区域问题
一.前言
有些时候我们会发现如果轴的范围不合适那么很难从图片中提取相应的信息,例如下方左图和有图很显然我们无法从中得出这二者密集程度的区别。除此之外很多时候我们想在一个坐标轴系统下展示两种不同的绘图,但是两者的轴域并不相同,这时候该怎么办呢?

我们再看一个示例,假设我们想在一个坐标轴绘制一个sin函数和一个cos函数,很显然下面的程序就能满足我们的需求。
fig, ax = plt.subplots(figsize=(10, 8))
x = np.linspace(0, 2*np.pi, 100)
ax.plot(np.sin(x), lw=2, color='c', label=r'$\sin({x})$')
ax.plot(np.cos(x), lw=2, color='k', label=r'$\cos({x})$')
ax.axhline(0, lw=4, color='r')
plt.grid(color='gray', ls=":")
plt.legend(loc='upper right', title=r'$\sin({x})$和$\cos({x})$示例', title_fontsize=12, shadow=True, fancybox=True, framealpha=0.8)
plt.show()
其画图结果如下:

接下来,假设我们还是用同样的方法绘制20*sin(x)和cos(x)那么会发生什么呢?请看下图

我们可以看到为了能正常显示完整的正弦函数,整个余弦函数都已经被压缩,显然这样是无法达到我们想要的效果。但是我们观察可以看到,两者的定义域是一致的,只有值域是不相同的,也就是说两者可以共享一个X轴,但是不能使用同一个Y轴,这也就是我们要解决的问题,同样也是共享单一区域的坐标轴的实际意义。本文主要讨论这两类问题的解决方案,即共享单一区域的坐标轴和共享不同子区绘图区域的坐标轴。文中代码只提供关键部分代码,导入必要的库以及库的初始化设置都已经省略。
二.解决方案
2.1共享单一区域的坐标轴解决方案
通过上面的例子我们已经知道解决这个问题的核心是如何共享X轴而不共享Y轴。我们可以使用twinx()方法制作并返回共享X轴的第二个轴系统。下面是该方法的定义:
twinx(ax=None)
参数1:ax:指定共享哪一个坐标轴系统
这里需要注意的是新的轴系统将会覆盖过去的轴系统,其Y轴刻度线和刻度标签在轴脊处生成。对于刚才的问题使用这个方法的代码如下:
fig, ax = plt.subplots(figsize=(10, 8))
x = np.linspace(0, 2*np.pi, 100)
line1 = ax.plot(20 * np.sin(x), lw=2, color='c', label=r'$\sin({x})$')
ax.axhline(0, lw=4, color='r')
ax2 = ax.twinx()
line2 = ax2.plot(np.cos(x), lw=2, color='k', label=r'$\cos({x})$')
plt.grid(color='gray', ls=":")
fig.suptitle(r'$\sin({x})$和$\cos({x})$示例', fontsize=20)
plt.show()
其画图结果如下:

可以看到两者共享了X轴但是分别拥有自己的Y轴,大的轴会进行收缩以满足小的轴。这样我们在面对两个数据差距很大的图也能在单一区域进行绘制了。
2.1共享不同子区绘图区域的坐标轴解决方案
对于不同共享不同子区绘图区域有两种解决方案,第一种是使用set_xlim()和set_ylim()方法手动修改坐标轴范围,当然修改共享区域只是这两个方法的冰山一角,单不妨碍我们达到我们想要的效果。示例代码如下:
x1 = np.linspace(-2*np.pi, 2*np.pi, 500)
y1 = np.cos(x1**2)
x2 = np.linspace(0.01, 10, 100)
y2 = np.sin(x2)
x3 = np.random.randint(0, 10, 50)
y3 = np.linspace(0, 3, 50)
x4 = np.random.randint(0, 25, 50)
y4 = np.linspace(0, 20, 50)
fig, ax = plt.subplots(1, 2)
fig.suptitle('使用set_xlim和set_ylim方法', fontsize=25)
ax[0].scatter(x3, y3)
ax[0].set_title("按照右图修改范围", fontsize=15)
ax[1].scatter(x4, y4)
ax[1].set_title('X轴取值:[-2, 25],Y轴取值:[-2, 20]', fontsize=15)
plt.subplots_adjust(wspace=0.6, top=0.8)
ax[0].set_xlim((-2, 25))
ax[0].set_ylim((-2, 20))
ax[1].set_xlim((-2, 25))
ax[1].set_ylim((-2, 20))
plt.show()
其画图结果如下:

从上图我们很容易看出两者谁的密集程度更大,相较于之前的错误示例这次的直观效果有了很大的提升。
第二种解决方案是在一开始的时候就指定好共享机制,即传递sharex和sharey参数给subplots方法。示例代码如下:
x1 = np.linspace(-2*np.pi, 2*np.pi, 500)
y1 = np.cos(x1**2)
x2 = np.linspace(0.01, 10, 100)
y2 = np.sin(x2)
x3 = np.random.randint(0, 10, 50)
y3 = np.linspace(0, 3, 50)
x4 = np.random.randint(0, 25, 50)
y4 = np.linspace(0, 20, 50)
fig, ax = plt.subplots(1, 2, sharey=True, sharex=True)
fig.suptitle('使用set_xlim和set_ylim方法', fontsize=25)
ax[0].scatter(x3, y3)
ax[0].set_title("按照右图修改范围", fontsize=15)
ax[1].scatter(x4, y4)
ax[1].set_title('X轴取值:[-2, 25],Y轴取值:[-2, 20]', fontsize=15)
plt.subplots_adjust(wspace=0.6, top=0.8)
plt.show()
其画图结果如下:

可以看到这两种方法的效果是一致的。这两个参数一共有五个有效值,分别是:
- True/‘all’:所有的子区都享有同一个坐标轴系统
- ‘col’:指定子区中的每一列都想有同样的坐标轴系统
- ‘row’:指定子区中的每一行都想有同样的坐标轴系统
- False/‘none’:不共享
- ax:指定一个子区,这样就可以单独指定任意两个子区共享坐标轴系统
一定切记共享的坐标轴系统都是所有子区中的最大值。即可能出现X轴和Y轴不来自一个子区的情况。
三.参考
版权声明
本文为[小猪猪家的大猪猪]所创,转载请带上原文链接,感谢
https://blog.csdn.net/pcx171/article/details/116500475
边栏推荐
- 网络层重要知识(面试、复试、期末)
- 传输层重要知识(面试,复试,期末)
- 【无标题】制作一个0-99的计数器,P1.7接按键,P2接数码管段,共阳极数码管,P3.0,P3.1接数码管位码,每按一次键,数码管显示加一。请写出单片机的C51代码
- Patrol inspection intercom communication system in power industry
- “泉”力以赴·同“州”共济|北峰人一直在行动
- Pep517 error during pycuda installation
- AUTOSAR从入门到精通100讲(八十七)-高级EEA的关键利器-AUTOSAR与DDS
- 美摄科技推出桌面端专业视频编辑解决方案——美映PC版
- 免费开源充电桩物联网云平台
- 关于短视频平台框架搭建与技术选型探讨
猜你喜欢

Int8 quantification and inference of onnx model using TRT

机器视觉系列(02)---TensorFlow2.3 + win10 + GPU安装

quill-editor图片缩放、在一个页面使用多个富文本框、quill-editor上传图片地址为服务器地址

Typora操作技巧说明(一).md

Beifeng communication helps Zhanjiang fire brigade build PDT wireless communication system

自定义钉钉机器人进行报警

公专融合对讲机是如何实现多模式通信下的协同工作?

How does the public and Private Integrated walkie talkie realize cooperative work under multi-mode communication?

海南凤凰机场智能通信解决方案

【无标题】制作一个0-99的计数器,P1.7接按键,P2接数码管段,共阳极数码管,P3.0,P3.1接数码管位码,每按一次键,数码管显示加一。请写出单片机的C51代码
随机推荐
《Multi-modal Visual Tracking:Review and Experimental Comparison》翻译
按需引入vant组件
商业版阿里MQ普通消息发送订阅Demo
GIS实战应用案例100篇(五十三)-制作三维影像图用以作为城市空间格局分析的底图
使用proteus仿真STM32超声波SRF04测距!Code+Proteus
自定义钉钉机器人进行报警
The people of Beifeng have been taking action
AMBA协议学习小记
Beifeng communication helps Zhanjiang fire brigade build PDT wireless communication system
go语言:在函数间传递切片
Flexible blind patch of ad hoc network | Beifeng oil and gas field survey solution
STM32多路测温无线传输报警系统设计(工业定时测温/机舱温度定时检测等)
Systrace 解析
带低压报警的51单片机太阳能充电宝设计与制作(完整代码资料)
启动mqbroker.cmd失败解决方法
GIS实战应用案例100篇(五十一)-ArcGIS中根据指定的范围计算nc文件逐时次空间平均值的方法
el-table 横向滚动条固定在可视窗口底部
商业广场无线对讲系统解决方案
项目文件“ ”已被重命名或已不在解决方案中、未能找到与解决方案关联的源代码管理提供程序——两个工程问题
不需要破解markdown编辑工具Typora