我该如何“伪造” matplotlib中的轴刻度?

时间:2019-01-07 08:57:38

标签: python matplotlib

我在matplotlib中有一个情节,看起来像这样: enter image description here

我还有一个不同的情节,看起来像这样: enter image description here

我想做的是创建一个看起来像这样的情节: enter image description here

也就是说,我想将数据点精确地保留在第一个绘图中,但是将x轴刻度和标签替换为第二个绘图中的那些。 (在这种情况下,它们是通过plt.xscale('symlog')生成的。)我似乎找不到一种简单的方法来执行此操作。有一个吗?

注意:它实际上不需要说,但是这个问题中的情节不是我的实际情节,我确实有理由要这样做。我很高兴澄清我要问的问题,但我认为询问我为什么需要它的细节并没有帮助。问题是关于如何去做我已经问过的特定事情,并且能对话题的回应表示赞赏。

4 个答案:

答案 0 :(得分:1)

我认为这个问题要求一种解决方法,以避免将数据转换为所需的比例。通过在绘制之前对数据应用反函数,这应该很简单。但是,问题中给出的信息不足,无法解决此类问题。


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

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()

enter image description here

此处x限制是任意选择的。问题将是将限制与原始数据相关联。由于双方的默认保证金均为5%,因此通常这并非易事,并且执行此任务的任何函数都将比对原始数据进行逆变换的函数复杂得多。

答案 1 :(得分:0)

万一将来有人遇到同样的问题,这是一个可行的解决方案。我不知道这是否是最好的方法。

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])])

我不明白为什么所有评论和其他答案都如此集中于此简单任务的“为什么”。我希望这会给所有其他人带来帮助。

答案 2 :(得分:0)

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

一般原则

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

  1. 使用“香草”单位绘制函数=> y = f(x)
  2. 以另一个单位表示x轴=> x [单位] = x'[deg]
  3. 用新单位绘制函数=> y = f(x')
  4. 选择不错的xlim,使点与以前一样在“相同位置”(请参阅​​ImportanceOfBeingErnest答案)

NB :您可以编写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。

答案 3 :(得分:0)

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

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