当前位置:网站首页>可视化常见问题解决方案(八)共享绘图区域问题解决方案
可视化常见问题解决方案(八)共享绘图区域问题解决方案
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
边栏推荐
- 关于短视频技术轮廓探讨
- 社区版阿里MQ普通消息发送订阅Demo
- 以智能生产引领行业风潮!美摄智能视频生产平台亮相2021世界超高清视频产业发展大会
- 字节跳动2020秋招编程题:根据工号快速找到自己的排名
- Solution of emergency communication system for major security incidents
- 美摄科技云剪辑,助力哔哩哔哩使用体验再升级
- LPDDR4笔记
- Int8 quantification and inference of onnx model using TRT
- AUTOSAR从入门到精通100讲(八十一)-AUTOSAR基础篇之FiM
- Typora操作技巧说明(一)
猜你喜欢
随机推荐
PyTorch 22. Pytorch common code snippet collection
golang实现正则匹配:密码包含至少一位数字,字母和特殊字符,且长度8-16
基于51单片机的三路超声波测距系统(定时器方式测距)
自定义classloader并实现热部署-使用loadClass
PyTorch 14. Module class
Detailed explanation of unwind stack backtracking
PyTorch 12. Hook usage
北峰通信助力湛江市消防支队构建PDT无线通信系统
以智能生产引领行业风潮!美摄智能视频生产平台亮相2021世界超高清视频产业发展大会
带低压报警的51单片机太阳能充电宝设计与制作(完整代码资料)
Beifeng communication helps Zhanjiang fire brigade build PDT wireless communication system
go iris框架实现多服务Demo:通过(监听8083端口的)服务1中的接口启动(监听8084端口的)服务2
商业广场无线对讲系统解决方案
(一)OpenPAI jupyter jupyterhub jupyterlab 方案比较
el-date-picker中自定义快捷选项picker-options,动态设置禁用日期
自定义钉钉机器人进行报警
Solution of wireless intercom system in Commercial Plaza
PyTorch 19. Differences and relations of similar operations in pytorch
在项目中的定时作用
带您遨游太空,美摄科技为航天创意小程序提供全面技术支持