Ändern Sie das Rasterintervall und geben Sie in Matplotlib Häkchenbezeichnungen an

82

Ich versuche, Zählungen in Rasterplots zu zeichnen, aber ich kann nicht herausfinden, wie ich vorgehe. Ich will:

  1. Haben Sie Gitter im Abstand von 5 gepunktet

  2. Haben Sie nur alle 20 große Häkchen

  3. Ich möchte, dass die Zecken außerhalb des Grundstücks liegen.

  4. Haben "Zählungen" in diesen Gittern

Ich habe nach möglichen Duplikaten wie hier und hier gesucht , konnte es aber nicht herausfinden.

Das ist mein Code.

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

Das bekomme ich.

Das bekomme ich.

Ich habe auch ein Problem beim Überschreiben der Datenpunkte. Könnte mir jemand bitte bei diesem Problem helfen?

Eule
quelle

Antworten:

186

Es gibt mehrere Probleme in Ihrem Code.

Zuerst die Großen:

  1. Sie erstellen in jeder Iteration Ihrer Schleife eine neue Figur und eine neue Achse → setzen fig = plt.figureund ax = fig.add_subplot(1,1,1)außerhalb der Schleife.

  2. Verwenden Sie nicht die Locators. Rufen Sie die Funktionen ax.set_xticks()und ax.grid()mit den richtigen Schlüsselwörtern auf.

  3. Mit plt.axes()erstellen Sie wieder eine neue Achse. Verwenden Sie ax.set_aspect('equal').

Die kleinen Dinge: Sie sollten die MATLAB-ähnliche Syntax nicht wie plt.axis()mit der objektiven Syntax mischen . Verwenden Sie ax.set_xlim(a,b)undax.set_ylim(a,b)

Dies sollte ein funktionierendes Minimalbeispiel sein:

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

Ausgabe ist dies:

Ergebnis

MaxNoe
quelle
2
Vielen Dank für Ihre Antwort! Du hast meine Probleme gelöst! Um die Ticks nach draußen zu setzen, musste ich nur ax.tick_params hinzufügen (which = 'both', direction = 'out').
Eule
29

Eine subtile Alternative zu MaxNoes Antwort, bei der Sie die Ticks nicht explizit festlegen, sondern stattdessen die Trittfrequenz festlegen .

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=':')

Matplotlib Custom Grid

getup8
quelle