前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matplotlib共享轴的艺术:揭秘并规避图形遮挡的策略

matplotlib共享轴的艺术:揭秘并规避图形遮挡的策略

作者头像
用户11172986
发布2024-06-20 18:25:56
620
发布2024-06-20 18:25:56
举报
文章被收录于专栏:气python风雨气python风雨

matplotlib共享轴的艺术:揭秘并规避图形遮挡的策略


导语:

在数据分析与可视化领域,matplotlib作为Python最主流的数据绘图库之一,以其强大的功能深受开发者喜爱。然而,在处理多子图共用坐标轴(即共享轴)时,如何避免不同子图间因轴线重叠造成的视觉信息遮挡问题呢?本文将深入剖析这一常见痛点,并为您提供一些解决思路。


温馨提示

由于可视化代码过长隐藏,可点击matplotlib共享轴的艺术:揭秘并规避图形遮挡的策略运行Fork查看 🔜🔜若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可

正文:

一、共享轴的重要性与挑战

在展示多个相关数据图表时,利用matplotlib的共享轴功能可以直观地对比不同数据集之间的关联和差异,增强整体分析的一致性和连贯性。但实践中我们往往会遇到这样的尴尬局面:当两个或多个子图共享x轴或y轴时,某些子图的重要部分可能被轴标签、刻度标记等元素所遮挡,影响了数据的表现力和可读性。

例如近日小明同学在绘制有共享轴的柱状图时发现 x轴的刻度是用ax控制画的,但是这样就会被ax_sub的柱子盖住一部分显示不全

In [1]:

代码语言:javascript
复制
代码语言:javascript
复制
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
plt.rcParams['font.sans-serif'] = ['Source Han Sans CN']  
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
stnname = ['XN(2295.2m)', 'GEM(2807.6m)', 'GN(2910m)', 'DL(3189m)', 'CD(3315m)', 'GZ(3393.5m)', 'LS(3648.9m)', 'YS(3716.9m)', 'NQ(4507m)']

# 生成随机数据
np.random.seed(0)
rmse_interp = np.random.rand(len(stnname))
rmse_avg = np.random.rand(len(stnname))
num_interp = np.random.randint(0, 10000, len(stnname))
num_avg = np.random.randint(0, 10000, len(stnname))

width = 0.2
x = np.arange(len(stnname))
x1 = x + width
x2 = x + 2 * width
x3 = x + 3 * width

fig, ax = plt.subplots(figsize=(12, 7))
legend_font = {
    'family': 'Source Han Sans CN',
    'style': 'normal',
    'size': 11,
    'weight': "bold"
}

f1 = ax.bar(x, rmse_interp, width=width, color='#62B197', label='RMSE-interp')
f2 = ax.bar(x1, rmse_avg, width=width, color='#B8DDBC', label='RMSE-avg')
ax.yaxis.set_minor_locator(ticker.AutoMinorLocator())
ax.set_yticks([0, 2, 4, 6, 8])
ax.set_yticklabels(['0', '2', '4', '6', '8'], fontsize=13, fontweight='bold')
ax.tick_params(which='major', axis='y', colors='#62B197', width=2, length=8)
ax.tick_params(which='minor', axis='y', colors='#62B197', width=2, length=5)
ax.set_ylabel('RMSE/K', fontsize=15, fontweight='bold')
ax.yaxis.get_label().set_color('#62B197')

ax_sub = ax.twinx()
f3 = ax_sub.bar(x2, num_interp, width=width, color='#E18E6D', label='NUM-interp')
f4 = ax_sub.bar(x3, num_avg, width=width, color='#ffb36b', label='NUM-avg')
ax_sub.yaxis.set_minor_locator(ticker.FixedLocator(np.arange(0, 10001, 400)))
ax_sub.set_yticks([0, 2000, 4000, 6000, 8000, 10000])
ax_sub.set_yticklabels(['0', '2000', '4000', '6000', '8000', '10000'], fontsize=13, fontweight='bold')
ax_sub.tick_params(which='major', axis='y', colors='#E18E6D', width=2, length=8)
ax_sub.tick_params(which='minor', axis='y', colors='#E18E6D', width=2, length=5)
ax_sub.set_ylabel('NUMBER', fontsize=15, fontweight='bold')
ax_sub.yaxis.get_label().set_color('#E18E6D')

ax.tick_params(axis='x', direction='in', width=6)
ax.set_xticks(x + 1.5 * width, stnname, fontsize=13, ha='right')

plt.legend(loc=(0.67, 0.86), frameon=True, prop=legend_font,
           handles=[f1, f2, f3, f4], labels=['RMSE-interp', 'RMSE-avg', 'NUM-interp', 'NUM-avg'],
           columnspacing=0.15, labelspacing=0)

plt.show()
代码语言:javascript
复制

于是,他问起了神奇海螺,它是这样回复的:

二、解决之道:精细化调整与布局优化

  1. 自动调整边距(tight_layout): matplotlib提供了plt.tight_layout()方法,它能自动调整子图间的间距以及四周的边距,以适应各种轴标签、图例等附加元素,确保所有内容都能完整展现。
代码语言:javascript
复制
代码语言:javascript
复制
import matplotlib.pyplot as plt    
# ... 绘制代码 ...    
plt.tight_layout()    
plt.show()
代码语言:javascript
复制
  1. 手动设置子图间距(subplots_adjust): 对于更精细的控制,可以通过plt.subplots_adjust()函数自定义顶部、底部、左侧和右侧的边距,以及wspace(水平间距)、hspace(垂直间距)参数。
代码语言:javascript
复制
代码语言:javascript
复制
plt.subplots_adjust(hspace=0.5, wspace=0.3)
代码语言:javascript
复制
  1. 轴标签旋转与定位(xlabel/ylabel rotation/position): 可以通过设定rotation参数来旋转轴标签,减少其占用的空间;同时结合labelpad参数调整标签与轴线的距离,防止遮挡图形区域。
代码语言:javascript
复制
代码语言:javascript
复制
plt.xlabel('X Label', rotation=45, labelpad=15)
代码语言:javascript
复制
  1. 使用GridSpec灵活布局: 若需更高层次的定制化,可通过mpl_toolkits.axes_grid1.GridSpec模块实现对子图位置及大小的精确规划,从而有效避免遮挡。
  2. 隐藏特定子图的轴标签: 当某个子图的轴标签与其他子图重复时,可以选择性地隐藏这些非必需的轴标签,以保持图表简洁而不失信息完整性。

综上所述,通过上述多种方法的组合运用,您可以轻松应对matplotlib中共享轴带来的遮挡问题,让您的数据可视化作品更具专业感与吸引力。


隐藏?对了,可以设置透明度 于是他往代码加了

代码语言:javascript
复制
ax_sub.set_zorder(ax.get_zorder()-1)    
ax.patch.set_alpha(0)

并加了一些细节,如下图

结尾讨论:

在实际应用中,每一位同学都会根据具体场景选择合适的策略来优化共享轴的布局。你是否有过类似的经历,或者已经探索出了独特的解决方式?欢迎留言分享你的实战经验和技巧,让我们共同探讨如何借助matplotlib绘制出既美观又富含信息量的共享轴图表,一起提升数据分析可视化的艺术水准。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • matplotlib共享轴的艺术:揭秘并规避图形遮挡的策略
  • 温馨提示
  • 一、共享轴的重要性与挑战
  • 二、解决之道:精细化调整与布局优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档