2
votes

Impossible d'inverser les xticks dans le sous-tracé matplotlib

J'ai conçu une sous-parcelle en utilisant matplotlib . J'essaye d'inverser les xticks de l'intrigue. Veuillez consulter l'exemple de code-

matplotlib.__version__
'2.1.1'

matplotlib.__version__numpy__
'1.7.1'

python --version
Python 2.7.15rc1

Veuillez voir ci-dessous le tracé généré- entrez la description de l'image ici

Veuillez faire attention aux xticks . Même si, ax.set_xticks (xticks) est utilisé mais les xticks n'ont pas changé. Est-ce que je manque un appel de fonction pour rendre le tracé?

Voici les informations système-

import numpy as np
import matplotlib.pyplot as plt

# generate the data
n = 6
y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

# generate the ticks and reverse it
xticks = range(n)
xticks.reverse()

# plot the data
plt.figure()
ax = plt.subplot(111)
ax.bar(x, y)
print xticks # prints [5, 4, 3, 2, 1, 0]
ax.set_xticks(xticks)
plt.show()

Veuillez noter que je veux simplement inverser les tiques et ne veulent pas inverser l'axe.


0 commentaires

3 Réponses :


1
votes

Utiliser:

# generate the data
n = 6
y = np.random.randint(low=0, high=10, size=n)
x = np.arange(n)

# generate the ticks and reverse it
xticks = range(n)
# xticks.reverse()

# plot the data
plt.figure()
ax = plt.subplot(111)
ax.bar(x, y)
# print xticks # prints [5, 4, 3, 2, 1, 0]
ax.set_xticklabels(xticks[::-1])          # <- Changed
plt.show()

 out


6 commentaires

Merci! Cela fonctionne, cependant, je ne comprenais pas ce qui suit: modification de range (n) en range (n + 1)


n + 1 n'est pas nécessaire ici. range (6) génère 0, 1, 2, 3, 4, 5. C'est tout ce dont l'OP a besoin. range (7) générera 0, 1, 2, 3, 4, 5, 6. Ici, 6 n'est pas nécessaire


@Bazingaa bien si vous le dites.


@meW: Pas parce que je le dis, mais parce qu'il n'y a que 6 barres. Vous avez donc besoin d'indices allant de 0 à 5, générés par range (6).


Je suis d'accord. C'est juste que lorsque j'ai expérimenté, je n'ai pas reçu le dernier tick avec n donc utilisé n + 1. De toute façon, je suis d'accord sur la plage (6) aussi, ce qui a du sens


C'est parce que le générateur de nombres aléatoires ne renvoie parfois pas une valeur particulière, donc la barre est manquante dans ce cas



4
votes

Avec ax.set_xticks , vous spécifiez actuellement des positions de graduation qui ne varient pas dans l'ordre de la liste. Soit vous passez [0, 1, 2, 3, 4, 5] , soit vous passez [5, 4, 3, 2, 1, 0] . La différence ne sera pas remarquée dans les tiques. Ce que vous voulez à la place, c'est avoir des ticklabels inversés pour lesquels vous devriez faire set_xticklabels (xticks [:: - 1]) . Il y a deux façons de le faire:

Voie 1

Utilisez plt.xticks où le premier argument spécifie l'emplacement des graduations et le le second argument spécifie les ticklabels respectifs. Plus précisément, xticks fournira les positions de graduation et xticks [:: - 1] étiquettera votre tracé avec des graduations inversées.

ax.set_xticks(xticks)
ax.set_xticklabels(xticks[::-1])

Voie 2 en utilisant ax où vous avez besoin de set_xticklabels pour obtenir ce que vous voulez

xticks = range(n)

# plot the data
plt.figure()
ax = plt.subplot(111)
ax.bar(x, y)

plt.xticks(xticks, xticks[::-1])
 entrez la description de l'image ici


2 commentaires

Merci beaucoup pour l'éxplication! J'ai réalisé mon erreur. J'ai aimé le Way 2 .


@RaviJoshi: Vous êtes les bienvenus. Heureux de vous aider. La première approche est cependant directe



0
votes

Vous pouvez également inverser l'ordre de l'axe ax.set_xlim ([5.5, -0.5])

import numpy as np
import matplotlib.pyplot as plt

n = 6
x = np.arange(n)
y = (x+1) **(1/2)

fig, axs = plt.subplots(1, 3, constrained_layout=True)
axs[0].bar(x, y)
axs[0].set_title('Original data')

axs[1].bar(x[::-1], y)
axs[1].set_xlim(5.5, -0.5)
axs[1].set_title('x index reversed\nand axis reversed')

axs[2].bar(x, y)
axs[2].set_xlim(5.5, -0.5)
axs[2].set_title('just axis reversed')

plt.show()

 entrez la description de l'image ici


1 commentaires

Je ne sais pas pourquoi cela a été rejeté - c'est la bonne façon d'inverser l'ordre des graduations, plutôt que de changer toutes les étiquettes.