python - real - Cómo agregar un segundo eje x en matplotlib
matplotlib ejes (5)
Estoy tomando nota de los comentarios en la respuesta de new_tick_locations
, parece que quieres establecer una lista de new_tick_locations
por una función desde el antiguo eje x al nuevo eje x. La función tick_function
continuación tick_function
una matriz numpy de puntos, los asigna a un nuevo valor y los formatea:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
X = np.linspace(0,1,1000)
Y = np.cos(X*20)
ax1.plot(X,Y)
ax1.set_xlabel(r"Original x-axis: $X$")
new_tick_locations = np.array([.2, .5, .9])
def tick_function(X):
V = 1/(1+X)
return ["%.3f" % z for z in V]
ax2.set_xlim(ax1.get_xlim())
ax2.set_xticks(new_tick_locations)
ax2.set_xticklabels(tick_function(new_tick_locations))
ax2.set_xlabel(r"Modified x-axis: $1/(1+X)$")
plt.show()
Tengo una pregunta muy simple. Necesito tener un segundo eje x en mi diagrama y quiero que este eje tenga un cierto número de tics que corresponden a cierta posición del primer eje.
Probemos con un ejemplo. Aquí estoy trazando la masa de materia oscura como una función del factor de expansión, definido como 1 / (1 + z), que va de 0 a 1.
semilogy(1/(1+z),mass_acc_massive,''-'',label=''DM'')
xlim(0,1)
ylim(1e8,5e12)
Me gustaría tener otro eje x, en la parte superior de mi gráfica, que muestre la z correspondiente para algunos valores del factor de expansión. ¿Es eso posible? Si es así, ¿cómo puedo tener xtics hacha
Me veo obligado a publicar esto como una respuesta en lugar de un comentario debido a la baja reputación. Tuve un problema similar a Matteo. La diferencia es que no tenía un mapa desde mi primer eje x hasta mi segundo eje x, solo los valores x mismos. Así que quise establecer los datos en mi segundo eje x directamente, no en los tics, sin embargo, no hay axes.set_xdata
. Pude usar la respuesta de Dhara para hacer esto con una modificación:
ax2.lines = []
En lugar de usar:
ax2.cla()
Cuando estaba en uso también ax1
mi parcela de ax1
.
Puede usar twiny para crear 2 escalas de eje x. Por ejemplo:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
a = np.cos(2*np.pi*np.linspace(0, 1, 60.))
ax1.plot(range(60), a)
ax2.plot(range(100), np.ones(100)) # Create a dummy plot
ax2.cla()
plt.show()
Ref: http://matplotlib.sourceforge.net/faq/howto_faq.html#multiple-y-axis-scales
Salida:
Respondiendo a su pregunta en los comentarios de respuesta de Dhara: " Me gustaría en el segundo eje x estos tics: (7,8,99) correspondiente a la posición del eje x 10, 30, 40. ¿Es posible de alguna manera? " Sí , es.
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
a = np.cos(2*np.pi*np.linspace(0, 1, 60.))
ax1.plot(range(60), a)
ax1.set_xlim(0, 60)
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax2 = ax1.twiny()
ax2.set_xlabel("x-transformed")
ax2.set_xlim(0, 60)
ax2.set_xticks([10, 30, 40])
ax2.set_xticklabels([''7'',''8'',''99''])
plt.show()
Obtendrás:
Si desea que su eje superior sea una función de los valores de control del eje inferior:
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
ax1 = fig.add_subplot(111)
ax1.plot(range(5), range(5))
ax1.grid(True)
ax2 = ax1.twiny()
ax1Xs = ax1.get_xticks()
ax2Xs = []
for X in ax1Xs:
ax2Xs.append(X * 2)
ax2.set_xticks(ax1Xs)
ax2.set_xbound(ax1.get_xbound())
ax2.set_xticklabels(ax2Xs)
title = ax1.set_title("Upper x-axis ticks are lower x-axis ticks doubled!")
title.set_y(1.1)
fig.subplots_adjust(top=0.85)
fig.savefig("1.png")
Da: