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

23

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

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

Yotam, у вас, кажется, есть много нерешенных вопросов, на которые уже дан ответ, но вы еще не приняли ответ. Примите ответ на старые вопросы или добавьте дополнительную информацию, чтобы мы могли вам помочь! Hooked

Ваш Ответ

3   ответа
10

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

Это то, что я хочу сделать сейчас. Я думал, что есть более элегантный способ. Yotam
58

Как вы заметили,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}'.forma,t(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 oche
Вот какой хак нам нужен Georgios Pligoropoulos
5

set_xlim(left, right), вот документы

Обновить

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

ticks = your_plot.get_xticks()*10**9
your_plot.set_xticklabels(ticks)
Насколько я понимаю, xlim изменяет диапазон сюжета и не масштабирует его. Смотрите мой пример. Yotam
Удивительно простое решение. Однако я считаю, что это приводит к меткам с десятичными знаками, даже если используется тикер, который должен отображать только целые числа (например, MultipleLocator или MaxNLocator). Я обнаружил, что это можно решить с помощьюticks.astype(int) вместо тогоticks. Mr.H
@ Yotam - Значит, вы хотите, чтобы график был идентичен, но значения на метках шкалы х изменятся? fraxel
К несчастью,get_xticks() не работает, пока вы не построите сюжет. Ужасно раздражает и бессмысленно делать так. ArturJ

Похожие вопросы