Изменение масштаба сюжета на фактор в матплотлибе

Я создаю сюжет на питоне. Есть ли способ изменить масштаб оси на фактор? yscale а также xscale только команды позволяют отключить масштабирование журнала.

Редактировать:
Например. Если у меня есть сюжет, где x масштаб изменяется от 1 нм до 50 нм, масштаб х будет варьироваться от 1x10^(-9) до 50x10^(-9), и я хочу, чтобы он изменился с 1 до 50. Таким образом, я хочу, чтобы функция графика делила x значения размещены на участке на 10 ^ (- 9)

3 ответа

Решение

Вместо того, чтобы менять галочки, почему бы не заменить единицы? Сделать отдельный массив 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()

Как вы заметили, xscale а также yscale не поддерживает простое линейное повторное масштабирование (к сожалению). В качестве альтернативы ответу Хукеда, вместо того, чтобы возиться с данными, вы можете обмануть ярлыки следующим образом:

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}$',

Чтобы установить диапазон оси X, вы можете использовать set_xlim(left, right) вот документы

Обновить:

Похоже, что вы хотите идентичный график, но только измените "значения тиков", вы можете сделать это, получив значения тиков, а затем просто изменив их на то, что вы хотите. Так что для вашей потребности это будет так:

ticks = your_plot.get_xticks()*10**9
your_plot.set_xticklabels(ticks)
Другие вопросы по тегам