Changer l'intervalle de grille et spécifier les étiquettes de tique dans Matplotlib
j'essaie de tracer des comptes dans des parcelles quadrillées, mais je ne suis pas en mesure de comprendre comment je m'y prends. Je veux:
-
ont des grilles pointillées à un intervalle de 5
-
n'ont que des étiquettes principales toutes les 20
-
je veux que les tiques soient en dehors de l'intrigue.
-
ont" des comptes "à l'intérieur de ces grilles
j'ai vérifié pour les duplicata potentiels tels que ici et ici , mais je n'ai pas été en mesure de le comprendre.
c'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:UsersOwlDesktopPlot.png'
plt.savefig(filename, dpi = 150)
plt.close()
C'est ce que j'obtiens.
j'ai également un problème d'écriture sur les points de données, ce qui me pose également problème... Quelqu'un pourrait-il MERCI de m'aider avec ce problème?
1 réponses
Il y a plusieurs problèmes dans votre code.
d'Abord le plus gros:
-
vous créez une nouvelle figure et de nouveaux axes à chaque itération de votre boucle → mettre
fig = plt.figure
etax = fig.add_subplot(1,1,1)
en dehors de la boucle. -
N'utilisez pas les localisateurs. Appelez les fonctions
ax.set_xticks()
etax.grid()
avec les bons mots-clés. -
avec
plt.axes()
vous créez à nouveau de nouveaux axes. Utilisezax.set_aspect('equal')
.
les petites choses:
Vous ne devez pas mélanger la syntaxe de type MATLAB comme plt.axis()
avec la syntaxe objective.
Utiliser ax.set_xlim(a,b)
et ax.set_ylim(a,b)
ceci devrait être un exemple de fonctionnement 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()
sortie: