繁体   English   中英

如何在 matplotlib 中“伪造”轴刻度?

[英]How can I "fake" the axis ticks in matplotlib?

我在matplotlib中有一个如下所示的图: 在此处输入图片说明

我还有一个不同的情节,看起来像这样: 在此处输入图片说明

我想要做的是创建一个看起来像这样的情节: 在此处输入图片说明

也就是说,我想将数据点精确地保留在它们在第一个图中的位置,但将 x 轴刻度和标签替换为第二个图中的刻度和标签。 (在这种情况下,它们是用plt.xscale('symlog') 。)我似乎找不到一种直接的方法来做到这一点。 有吗?

注意:它不应该真的需要说,但是这个问题中的情节不是我的实际情节,我确实有理由想要这样做。 我很高兴澄清我提出的问题,但我认为询问我为什么需要它的详细信息没有帮助。 问题是关于如何做我问过的具体事情如何做,并且对主题的回答表示赞赏。

我认为这个问题需要一种解决方法,以避免将数据转换为所需的规模。 通过在绘图之前将反函数应用于数据,这应该非常简单。 然而,问题中没有提供足够的信息来说明这种解决方案的问题是什么。


因此,人们只能按原样回答问题; 这基本上转化为创建一个完全不相关的轴。

import numpy as np
import matplotlib.pyplot as plt

x,y = np.random.rand(2,30)

fig, ax = plt.subplots()
ax.plot(x,y, ls="", marker="+")

ax2 = ax.twiny()
ax2.set_xscale("symlog")
ax2.tick_params(axis="x", which="both", bottom=True, labelbottom=True, 
                top=False, labeltop=False)
ax.tick_params(axis="x", bottom=False, labelbottom=False)
ax2.set_xlim(-50,50)

plt.show()

在此处输入图片说明

这里 x 限制是任意选择的。 问题是将限制与原始数据相关联。 由于双方都有 5% 的默认余量,这通常不是微不足道的,执行此任务的任何函数都将比计算原始数据逆变换的函数复杂得多。

您可以像这样简单地设置 xticks 的标签。

plt.xticks(np.arange(3), [10, 10^2, 10^5]) 

如果将来有人遇到同样的问题,这里有一个有效的解决方案。 我不知道这是不是最好的方法。

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

# use ax1 to plot the data

ax1.axes("off")
ax2 = fig.add_axes(ax1.get_position())
ax2.patch.set_alpha(0)

# then do whatever you want to set up the axes of ax2. In my case:

ax1_xlim = ax1.get_xlim()
ax2.set_xlim([-np.power(10,-ax1_xlim[0]), np.power(10,ax1_xlim[1])])

我不明白为什么所有的评论和其他答案都如此关注这个简单任务的“为什么”。 尽管有很多噪音,但我希望这对其他人有帮助。

ImportanceOfBeingErnest 说这是一个重新缩放的问题,我同意他的观点。

一般原则

据我了解,您正在尝试执行以下操作:

  1. 用 'vanilla' unit => y = f(x) 绘制你的函数
  2. 用另一个单位表示 x 轴 => x [unit] = x' [deg]
  3. 用新单位绘制你的函数 => y = f(x')
  4. 选择 nice xlim 将点放在与以前相同的位置(请参阅 ImportanceOfBeingErnest 答案)

注意:您可以编写 x' = g(x) 另一个函数,然后让 y = f ( g(x) ) 您只需要知道这个 g 函数即可重新缩放。

我再说一遍,我将此问题视为单位更改问题 所以答案取决于问题、它的性质、它的参数。 这就是隐藏在这个 g 函数背后的东西。

几乎是您需要的答案

在你的情况下,根据你展示的情节,我可以给你一个大概的答案:

x' = 10 * ( x - 0.5)

np.semilogx(x',y)

0.5 因为新的 0 似乎是您拥有 0.5 的地方。 我减去以将新点集中在 0.5 中。 10 * 因为您将 0.1 转换为 10^0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM