2012-04-16 25 views
21

Estoy creando una trama en python. ¿Hay alguna manera de volver a escalar el eje por un factor? Los comandos yscale y xscale solo me permiten desactivar la escala de registro.Cambiando la escala de la gráfica por un factor en matplotlib

Editar:
Por ejemplo. Si tengo un gráfico donde las escalas x van de 1 nm a 50 nm, la escala x variará de 1x10^(- 9) a 50x10^(- 9) y quiero que cambie de 1 a 50. Por lo tanto, desea que la función plot para dividir los valores de x colocados en el terreno por 10^(- 9)

+4

Yotam, parece que tiene muchas preguntas pendientes que han sido respondidas, pero que aún tiene que aceptar una respuesta. ¡Acepte una respuesta a las preguntas anteriores o agregue información adicional para que podamos ayudarlo! – Hooked

Respuesta

10

En lugar de cambiar las garrapatas, por qué no cambiar las unidades en su lugar? Haga una matriz separada X de valores x cuyas unidades están en nm. ¡De esta manera, cuando tramas los datos ya está en el formato correcto! Solo asegúrese de agregar un xlabel para indicar las unidades (que deben siempre hacerse de todos modos).

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

+0

Esto es lo que quiero hacer ahora. Pensé que hay una manera más elegante. – Yotam

5

para establecer el rango del eje x, se puede utilizar set_xlim(left, right), here are the docs

actualización:

Parece que quieres una trama idéntica, pero solo cambias los 'valores de tilde', puedes hacer eso obteniendo los valores de tilde y luego simplemente cambiándolos a lo que quieras. Así que para su necesidad sería así:

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

Según entiendo, xlim cambia el rango de la gráfica y no la escala. Ver mi ejemplo. – Yotam

+0

@Yotam - Entonces, ¿quieres que la trama sea idéntica, pero cambiarían los valores en las etiquetas de la escala x? – fraxel

+0

Solución increíblemente simple. Sin embargo, creo que esto da como resultado etiquetas con decimales, incluso cuando se usa un indicador que solo debe mostrar números enteros (por ejemplo, MultipleLocator o MaxNLocator). Descubrí que esto se puede resolver usando 'ticks.astype (int)' en lugar de 'ticks'. –

40

Como usted ha notado, xscale y yscale no es compatible con un simple re-escalado lineal (por desgracia). Como alternativa a la respuesta de enganchado, en lugar de jugar con los datos, se puede engañar a las etiquetas de este modo:

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

Un ejemplo completo con tanto x como y escalamiento:

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() 

Y finalmente tengo los créditos correspondientes a una imagen:

Left: ax1 no scaling, right: ax2 y axis scaled to kilo and x axis scaled to nano

tenga en cuenta que, si tiene text.usetex: true como lo he hecho, es posible que desee incluir el la bels en $, como el siguiente: '${0:g}$'.

+0

Esta es probablemente la respuesta más correcta. Gracias @oystein – oche

+0

Ese es el truco que necesitamos –

Cuestiones relacionadas