Изменение масштаба графика в процентах в matplotlib
Я создаю сюжет в python. Есть ли способ перемасштабировать ось на фактор? Команды yscale
и xscale
позволяют мне отключать масштаб журнала.
Edit:
Например. Если у меня есть график, где шкала x
идет от 1 нм до 50 нм, шкала х будет варьироваться от 1x10 ^ (- 9) до 50x10 ^ (- 9), и я хочу, чтобы она менялась от 1 до 50. Таким образом, Я хочу, чтобы функция plot разделила значения x, помещенные на график, на 10 ^ (- 9)
Ответы
Ответ 1
Вместо того, чтобы менять тики, почему бы не изменить единицы вместо этого? Создайте отдельный массив X
значений x, единицы которых находятся в нм. Таким образом, при построении данных он уже в правильном формате! Просто убедитесь, что вы добавили 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()
![enter image description here]()
Ответ 2
Как вы заметили, xscale
и yscale
не поддерживают простое линейное масштабирование (к сожалению). В качестве альтернативы Hooked answer, вместо того, чтобы возиться с данными, вы можете обмануть эти метки следующим образом:
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()
И, наконец, у меня есть кредиты для картины:
![Влево: ax1 нет масштабирования, справа: ось ax2 y масштабируется до кило и оси x, масштабированной до нано]()
Обратите внимание, что если у вас есть text.usetex: true
, как я есть, вы можете заключить метки в $
, например: '${0:g}$'
.
Ответ 3
Чтобы установить диапазон оси x, вы можете использовать set_xlim(left, right)
, вот документы
Update:
Похоже, что вы хотите идентичный сюжет, но меняете только значения "галочки", вы можете сделать это, получив значения тика, а затем просто изменив их на все, что захотите. Поэтому для ваших нужд это будет так:
ticks = your_plot.get_xticks()*10**9
your_plot.set_xticklabels(ticks)