wake-up-neo.com

Ändern Sie das Rasterintervall und geben Sie die Teilstrichbezeichnungen in Matplotlib an

Ich versuche, Zählungen in Rasterplots zu zeichnen, aber ich kann nicht herausfinden, wie ich damit umgehe. Ich möchte:

  1. Punktraster im Abstand von 5 haben

  2. Habe nur alle 20 Major Tick Labels

  3. Ich möchte, dass die Zecken außerhalb der Handlung sind.

  4. Haben "zählt" in diesen Gittern

Ich habe nach möglichen Duplikaten wie hier und hier gesucht, aber ich konnte es 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.

This is what I get.

Ich habe auch ein Problem mit dem Überschreiben der Datenpunkte, mit denen ich ebenfalls Probleme habe. Könnte mir jemand bei diesem Problem helfen?

57
owl

Es gibt verschiedene Probleme in Ihrem Code.

Zuerst die Großen:

  1. Sie erstellen in jeder Iteration Ihrer Schleife eine neue Figur und eine neue Achse → Setzen Sie fig = plt.figure Und 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() legen Sie wieder eine neue Achse an. Verwenden Sie ax.set_aspect('equal').

Die kleinen Dinge: Sie sollten die MATLAB-ähnliche Syntax wie plt.axis() nicht mit der objektiven Syntax mischen. Benutze ax.set_xlim(a,b) und ax.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()

Die Ausgabe lautet wie folgt:

result

136
MaxNoe

Eine subtile Alternative zu MaxNoes Antwort , bei der Sie nicht explizit die Häkchen setzen, sondern die Trittfrequenz.

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

8
getup8