【问题标题】:Changing plot scale by a factor in matplotlib通过 matplotlib 中的一个因子更改绘图比例
【发布时间】:2012-04-16 09:26:26
【问题描述】:

我正在用 python 创建一个情节。有没有办法按一个因子重新缩放轴? yscalexscale 命令只允许我关闭对数比例。

编辑:
例如。如果我有一个 x 刻度从 1 nm 到 50 nm 的图,则 x 刻度范围将从 1x10^(-9) 到 50x10^(-9),我希望它从 1 变为 50。因此,我希望绘图函数将放置在绘图上的 x 值除以 10^(-9)

【问题讨论】:

  • Yotam,您似乎有许多未解决的问题已得到解答,但您尚未接受答案。请接受旧问题的答案或添加其他信息,以便我们为您提供帮助!

标签: python plot matplotlib


【解决方案1】:

如您所见,xscaleyscale 不支持简单的线性重新缩放(很遗憾)。作为 Hooked 答案的替代方案,您可以像这样欺骗标签,而不是弄乱数据:

ticks = ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x*scale))
ax.xaxis.set_major_formatter(ticks)

显示 x 和 y 缩放的完整示例:

import numpy as np
import pylab as plt
import matplotlib.ticker as ticker

# Generate data
x = np.linspace(0, 1e-9)
y = 1e3*np.sin(2*np.pi*x/1e-9) # one period, 1k amplitude

# setup figures
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
# plot two identical plots
ax1.plot(x, y)
ax2.plot(x, y)

# Change only ax2
scale_x = 1e-9
scale_y = 1e3
ticks_x = ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x/scale_x))
ax2.xaxis.set_major_formatter(ticks_x)

ticks_y = ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x/scale_y))
ax2.yaxis.set_major_formatter(ticks_y)

ax1.set_xlabel("meters")
ax1.set_ylabel('volt')
ax2.set_xlabel("nanometers")
ax2.set_ylabel('kilovolt')

plt.show() 

最后我得到了一张照片的学分:

请注意,如果您像我一样拥有text.usetex: true,则可能需要将标签括在$ 中,如下所示:'${0:g}$'

【讨论】:

  • 这可能是更正确的答案。谢谢@oystein
  • 这就是我们需要的 hack
  • 在左侧,您会在右下角看到“x 10^-9”。使用FuncFormatter 这个功能似乎被禁用了。很遗憾,我需要这个功能。
【解决方案2】:

与其改变刻度,不如改变单位?创建一个单独的数组X 的 x 值,其单位为 nm。这样,当您绘制数据时,它已经是正确的格式!只需确保添加 xlabel 来指示单位(无论如何都应该始终这样做)。

from pylab import *

# Generate random test data in your range
N = 200
epsilon = 10**(-9.0)
X = epsilon*(50*random(N) + 1)
Y = random(N)

# X2 now has the "units" of nanometers by scaling X
X2 = (1/epsilon) * X

subplot(121)
scatter(X,Y)
xlim(epsilon,50*epsilon)
xlabel("meters")

subplot(122)
scatter(X2,Y)
xlim(1, 50)
xlabel("nanometers")

show()

【讨论】:

  • 这就是我现在想做的。我认为有更优雅的方式。
【解决方案3】:

要设置x轴的范围,可以使用set_xlim(left, right)here are the docs

更新:

看起来您想要一个相同的绘图,但只更改“刻度值”,您可以通过获取刻度值然后将它们更改为您想要的任何值来实现。因此,根据您的需要,它会是这样的:

ticks = your_plot.get_xticks()*10**9
your_plot.set_xticklabels(ticks)

【讨论】:

  • 据我了解,xlim 改变了绘图的范围并且不缩放它。看我的例子。
  • @Yotam - 所以你希望情节相同,但 x 比例标签上的值会改变?
  • 非常简单的解决方案。但是,我发现这会导致带有小数的标签,即使使用只应显示整数的代码(例如 MultipleLocator 或 MaxNLocator)。我发现这可以通过使用ticks.astype(int) 而不是ticks 来解决。
  • 不幸的是,get_xticks() 在您绘制之后才起作用。把它变成那样非常烦人而且毫无意义。
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 2020-06-21
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多