Me gustaría eliminar una marca y su etiqueta y, en su lugar, agregar una nueva etiqueta de marca en una ubicación diferente (pero cercana) sin la marca en sí. No estoy seguro de cómo hacer esto. Se da un ejemplo.

import matplotlib.pyplot as plt
def main():
    fig = plt.figure()
    x = [1,2,3,4,5]
    y = x
    ax = fig.add_subplot(1,1,1)
    y_ticks = ax.yaxis.get_major_ticks()
    y_ticks[-1].label.set_visible(False)
    ax.set_yticks([3.7], minor=True)
    ax.set_yticklabels(["100"], minor=True)
    ax.plot(x,y)
    plt.show()
if __name__ == '__main__':
    main()

Lo que me queda aquí es eliminar los ticks ubicados en y = 3.5, 3.7.

Además, como puede ver, accedí a y_ticks [-1] para configurar su etiqueta como invisible. Esto fue elegido arbitrariamente y en realidad agradecería si alguien pudiera explicar por qué y_ticks [-1] elige la marca ubicada en y = 3.5.

Gracias

enter image description here

Editar:

Como se mencionó en las dos respuestas, cambié mi código a:

import matplotlib.pyplot as plt

def main():
    fig = plt.figure()
    x = [1,2,3,4,5]
    y = x
    ax = fig.add_subplot(1,1,1)
    ax.plot(x,y)
    ax.set_yticks([3.7], minor=True)
    ax.set_yticklabels(["100"], minor=True)
    y_ticks = ax.yaxis.get_major_ticks()
    y_ticks[5].set_visible(False)
    y_ticks[6].label.set_visible(False)
    plt.show()
if __name__ == '__main__':
    main()

Esto produce el gráfico a continuación y puede ver que y_ticks[5] se refiere a la marca ubicada en y=3.5 y y_ticks[6] a la marca ubicada en y=4.0 - se salta la marca ubicada en { {X4}}. Entonces, ¿cómo puedo acceder y eliminar SOLO la marca? Las dos sugerencias solo explican cómo eliminar tanto la marca como la etiqueta o solo la etiqueta (sin la marca) y estoy buscando eliminar la marca y mantener la etiqueta.

enter image description here

0
noamg 8 may. 2016 a las 13:59

3 respuestas

La mejor respuesta

Pruebe y_ticks[-1].set_visible(False) en lugar de y_ticks[-1].label.set_visible(False). Hace que tanto la etiqueta como el marcador sean invisibles.

editar:

Puede acceder a la pequeña marca en 3,7 usando ax.yaxis.get_minor_ticks() como en el siguiente código:

import matplotlib.pyplot as plt

fig = plt.figure()
x = [1,2,3,4,5]
y = x
ax = fig.add_subplot(1,1,1)
ax.set_yticks([3.7], minor=True)
ax.set_yticklabels(["100"], minor=True)
ax.plot(x,y)

y_ticks = ax.yaxis.get_major_ticks()
y_ticks[5].set_visible(False)
y_minor_ticks = ax.yaxis.get_minor_ticks()
y_minor_ticks[0].label.set_visible(False)

plt.show()

Si desea que solo desaparezca la marca cerca de 100, y desea conservar la etiqueta, use:

ax.yaxis.get_minorticklines()[0].set_visible(False)

En lugar de :

y_minor_ticks = ax.yaxis.get_minor_ticks()
y_minor_ticks[0].label.set_visible(False)

Todas esas funciones que permiten acceder a diferentes partes de la marca se describen en matplotlib.axis documentación.

1
Tony Babarino 9 may. 2016 a las 15:26

Lo que sucede es: obtienes la lista de y_ticks después de haber creado un eje, pero antes trazas algo. Entonces matplotlib configura un eje con seis marcas en ambos ejes, de 0.0 a 1.0, y le da la lista de marcas.

Luego, cuando traza, se agregan más marcas y las marcas en su lista se actualizan con las nuevas etiquetas. El último elemento en sus y_ticks [] está ahora en el medio del eje Y.

Solución: Trace primero, luego y_ticks = ax.yaxis.get_major_ticks().

1
Åsmund 8 may. 2016 a las 17:24

Ok, encontré una respuesta. La marca y agregada en y=3.7 se agregó al eje menor en lugar del eje mayor. Por lo tanto, accedí por ax.tick_params(axis='y', which='minor', length=0). Sin embargo, esto establecerá TODOS los ticks menores de acuerdo con tick_params.

import matplotlib.pyplot as plt

def main():
    fig = plt.figure()
    x = [1,2,3,4,5]
    y = x
    ax = fig.add_subplot(1,1,1)
    ax.plot(x,y)
    ax.set_yticks([3.7], minor=True)
    ax.set_yticklabels(["100"], minor=True)
    y_ticks_major = ax.yaxis.get_major_ticks()
    y_ticks_major[5].set_visible(False)
    ax.tick_params(axis='y', which='minor', length=0)
    plt.show()
if __name__ == '__main__':
    main()

Gracias por la ayuda

1
noamg 9 may. 2016 a las 11:11