Cambie el intervalo de la cuadrícula y especifique etiquetas de marca en Matplotlib


82

Estoy tratando de trazar recuentos en parcelas cuadriculadas, pero no puedo averiguar cómo lo hago. Quiero:

  1. Tienen cuadrículas de puntos en un intervalo de 5

  2. Tenga etiquetas de marca importantes solo cada 20

  3. Quiero que las garrapatas estén fuera de la trama.

  4. Tener "recuentos" dentro de esas cuadrículas.

He comprobado posibles duplicados, como aquí y aquí , pero no he podido averiguarlo.

Este es mi codigo.

import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

for key, value in sorted(data.items()):
    x = value[0][2]
    y = value[0][3]
    count = value[0][4]

    fig = plt.figure()
    ax = fig.add_subplot(111)

    ax.annotate(count, xy = (x, y), size = 5)
    # Overwrites and I only get the last data point

    plt.close()
    # Without this, I get "fail to allocate bitmap" error

plt.suptitle('Number of counts', fontsize = 12)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.axes().set_aspect('equal')

plt.axis([0, 1000, 0, 1000])
# This gives an interval of 200

majorLocator   = MultipleLocator(20)
majorFormatter = FormatStrFormatter('%d')
minorLocator   = MultipleLocator(5)
# I want minor grid to be 5 and major grid to be 20
plt.grid()

filename = 'C:\Users\Owl\Desktop\Plot.png'
plt.savefig(filename, dpi = 150)
plt.close()

Esto es lo que obtengo.

Esto es lo que obtengo.

También tengo el problema de sobrescribir los puntos de datos. ¿Alguien podría POR FAVOR ayudarme con este problema?

Respuestas:


188

Hay varios problemas en su código.

Primero los grandes:

  1. Está creando una nueva figura y un nuevo eje en cada iteración de su bucle → poner fig = plt.figurey ax = fig.add_subplot(1,1,1)fuera del bucle.

  2. No use los localizadores. Llame a las funciones ax.set_xticks()y ax.grid()con las palabras clave correctas.

  3. Con plt.axes()usted está creando un nuevo eje de nuevo. Utilice ax.set_aspect('equal').

Las cosas menores: no debe mezclar la sintaxis similar plt.axis()a MATLAB como con la sintaxis objetiva. Utilice ax.set_xlim(a,b)yax.set_ylim(a,b)

Este debería ser un ejemplo mínimo funcional:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# Major ticks every 20, minor ticks every 5
major_ticks = np.arange(0, 101, 20)
minor_ticks = np.arange(0, 101, 5)

ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor=True)
ax.set_yticks(major_ticks)
ax.set_yticks(minor_ticks, minor=True)

# And a corresponding grid
ax.grid(which='both')

# Or if you want different settings for the grids:
ax.grid(which='minor', alpha=0.2)
ax.grid(which='major', alpha=0.5)

plt.show()

La salida es esta:

resultado


2
¡Muchas gracias por tu respuesta! ¡Resolviste mis problemas! Para establecer las garrapatas afuera, solo tuve que agregar ax.tick_params (que = 'ambos', dirección = 'afuera').
búho

29

Una alternativa sutil a la respuesta de MaxNoe en la que no establece explícitamente los tics, sino que establece la cadencia.

import matplotlib.pyplot as plt
from matplotlib.ticker import (AutoMinorLocator, MultipleLocator)

fig, ax = plt.subplots(figsize=(10, 8))

# Set axis ranges; by default this will put major ticks every 25.
ax.set_xlim(0, 200)
ax.set_ylim(0, 200)

# Change major ticks to show every 20.
ax.xaxis.set_major_locator(MultipleLocator(20))
ax.yaxis.set_major_locator(MultipleLocator(20))

# Change minor ticks to show every 5. (20/4 = 5)
ax.xaxis.set_minor_locator(AutoMinorLocator(4))
ax.yaxis.set_minor_locator(AutoMinorLocator(4))

# Turn grid on for both major and minor ticks and style minor slightly
# differently.
ax.grid(which='major', color='#CCCCCC', linestyle='--')
ax.grid(which='minor', color='#CCCCCC', linestyle=':')

Cuadrícula personalizada de Matplotlib

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.