如何在ggplot中使用缩放坐标轴绘制无穷远以外的位置?
直接用非数据坐标搞定,不用改数据
你要的其实就是绕开自定义轴变换,直接用Matplotlib自带的轴归一化坐标或者画布坐标来绘图,完全不用碰原始数据,步骤很简单:
Matplotlib里除了受自定义变换影响的「数据坐标」,还有两种不受变换约束的坐标系统:
- 轴归一化坐标(
transAxes):把整个轴的可视区域当成一个0到1的正方形——左下角是(0,0),右上角是(1,1)。要画在"无穷远之外"?直接用小于0(轴左边)或大于1(轴右边)的数值就行,比如x=1.2就是轴右侧20%宽度的位置。 - 画布归一化坐标(
transFigure):以整个绘图窗口的左下角为(0,0),右上角为(1,1),适合跨子图绘图的场景。
给你举个实际代码例子,假设你已经用了Sigmoid这类把无限区间压到有限范围的自定义变换:
import matplotlib.pyplot as plt import numpy as np from matplotlib.transforms import FuncTransform # 自定义轴变换:Sigmoid把(-∞,∞)压缩到(0,1) def forward(x): return 1 / (1 + np.exp(-x)) def inverse(x): return np.log(x / (1 - x)) # 初始化绘图 fig, ax = plt.subplots() ax.set_xscale('function', functions=(forward, inverse)) # 用轴归一化坐标在"无穷远右侧"画内容,完全绕开自定义变换 # 画一条竖线在轴右侧10%的位置 ax.axvline(x=1.1, color='darkred', linewidth=2, transform=ax.transAxes) # 在竖线位置加个标注 ax.text(1.1, 0.5, '这是无穷远之外', ha='left', va='center', transform=ax.transAxes) plt.show()
核心就是给绘图函数加个transform=ax.transAxes参数——这样所有坐标都是基于轴的可视范围,和你自定义的轴变换彻底没关系,原始数据该怎么画还是怎么画,完全不用修改。
如果需要把数据点的位置转换成轴归一化坐标来对齐,也可以用坐标转换工具,但如果只是单纯画外部元素,直接用transAxes是最简洁的。
内容的提问来源于stack exchange,提问作者juhraffe
相关产品推荐
相关产品推荐

