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é-
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.
3 Réponses :
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()
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
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])
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
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()
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.