通过matplotlib中的因子更改绘图比例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过matplotlib中的因子更改绘图比例相关的知识,希望对你有一定的参考价值。
我在python中创建一个情节。有没有办法按轴重新缩放轴? yscale
和xscale
命令只允许我关闭对数刻度。
编辑:
例如。如果我有一个x
标度从1 nm到50 nm的图,x标度范围从1x10 ^( - 9)到50x10 ^( - 9),我希望它从1变为50.因此,我想要绘图功能将图上放置的x值除以10 ^( - 9)
答案
而不是改变刻度,为什么不改变单位呢?制作一个单独的数组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()
另一答案
正如您所注意到的那样,xscale
和yscale
不支持简单的线性重新缩放(不幸的是)。作为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}$'
。
另一答案
要设置x轴的范围,可以使用set_xlim(left, right)
,here are the docs
更新:
看起来你想要一个相同的情节,但只改变'刻度值',你可以通过获取刻度值然后只需将它们更改为你想要的任何值来做到这一点。因此,根据您的需要,它将是这样的:
ticks = your_plot.get_xticks()*10**9
your_plot.set_xticklabels(ticks)
以上是关于通过matplotlib中的因子更改绘图比例的主要内容,如果未能解决你的问题,请参考以下文章
通过鼠标单击获取 matplotlib 绘图图 python 的坐标