web-dev-qa-db-fra.com

Changer l'intervalle de grille et spécifier les étiquettes de graduation dans Matplotlib

J'essaie de tracer des chiffres dans des parcelles maillées, mais je ne suis pas en mesure de comprendre comment je vais y arriver. Je veux:

  1. Avoir des grilles en pointillés à un intervalle de 5

  2. N'avoir que les principales étiquettes de ticks tous les 20

  3. Je veux que les tiques soient en dehors de l'intrigue.

  4. Avoir des "comptes" à l'intérieur de ces grilles

J'ai vérifié les doublons potentiels tels que ici et ici , mais je n'ai pas été en mesure de le comprendre.

Ceci est mon 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()

C'est ce que je reçois.

This is what I get.

J'ai également un problème de réécriture des points de données, ce qui me pose également problème ... Quelqu'un peut-il SVP m'aider à résoudre ce problème?

57
owl

Il y a plusieurs problèmes dans votre code.

D'abord les grands:

  1. Vous créez une nouvelle figure et de nouveaux axes à chaque itération de votre boucle → mettez fig = plt.figure et ax = fig.add_subplot(1,1,1) en dehors de la boucle.

  2. N'utilisez pas les localisateurs. Appelez les fonctions ax.set_xticks() et ax.grid() avec les mots-clés appropriés.

  3. Avec plt.axes() vous créez à nouveau un nouvel axe. Utilisez ax.set_aspect('equal').

Les choses mineures: Vous ne devez pas mélanger la syntaxe de type MATLAB telle que plt.axis() avec la syntaxe de l'objectif. Utiliser ax.set_xlim(a,b) et ax.set_ylim(a,b)

Cela devrait être un exemple de travail minimal:

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 sortie est la suivante:

result

136
MaxNoe

Une alternative subtile à réponse de MaxNoe où vous ne définissez pas explicitement les ticks, mais plutôt la cadence.

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