0
votes

Comment dessiner deux sous-graphiques différents en utilisant matplotlib adjacents l'un à l'autre?

J'ai deux graphiques différents, le premier est Frequency vs Features et l'autre est Frequency vs Perte de Yield .

Chacun des graphiques est un graphique à barres avec une ligne de tendance qui montre le% cumulé ou la perte de rendement sur le côté droit de l'axe Y.

Ainsi, pour chacun des graphiques, l'axe X montre le nom des caractéristiques, l'axe Y gauche montre la fréquence et l'axe Y droit montre le% cumulé ou la perte de rendement.

Voici le code que j'ai écrit et il montre la sortie suivante.

#Trendline_change_2
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
ax1 = df.iloc[:HOW_MANY,:]['FailCount'].plot(kind="bar",stacked = True,legend=False,figsize=(8,8), label = 'frequency plot',color = 'green',title="Frequency of failure vs Feature")  #Graph naming changes
ax1.set_ylabel('Frequency', color='b')
ax1.tick_params('y', colors='b')
ax1.set_xticklabels(np.asarray(df['Feature'])[:HOW_MANY])

ax2 = ax1.twinx()
ax2.plot(np.asarray(df['Cummulative_aggr'])[:HOW_MANY],linestyle='--', marker='s',label ='cummulative %', color='r')
ax2.set_ylabel('Cummulative %', color='r')

plt.legend(loc='best')

#Plot 2

fig, ax1 = plt.subplots()
ax1 = df.iloc[:HOW_MANY,:]['FailCount'].plot(kind="bar",stacked = True,legend=False,figsize=(8,8), label = 'frequency plot',color = 'green',title="Frequency of failure vs Feature")  #Graph naming changes
ax1.set_ylabel('Frequency', color='b')
ax1.tick_params('y', colors='b')
ax1.set_xticklabels(np.asarray(df['Feature'])[:HOW_MANY])

ax2 = ax1.twinx()
ax2.plot(np.asarray(df['Yield_Loss'])[:HOW_MANY],linestyle='--', marker='s',label ='Yield Loss', color='black')
ax2.set_ylabel('Yield Loss', color='black')


plt.legend(loc='best')
plt.tight_layout()
plt.show()

entrez la description de l'image ici

Tout va bien sauf que je voudrais changer les deux parcelles côte à côte l'une en dessous de l'autre .

J'ai essayé plusieurs choses pour les mettre côte à côte comme plt.subplot(1,2,1) et d'autres paramètres, mais le résultat n'est pas satisfaisant.

Quelqu'un peut-il m'aider à modifier cela? Je sais que je suis proche mais je ne peux pas faire les choses correctement.


4 commentaires

Votre code créerait deux chiffres. Pourquoi votre exemple de sortie affiche-t-il des sous-graphiques? Travaillez-vous dans un environnement comme Jupyter ou similaire où le traçage en ligne vous fait penser que vous avez deux sous-graphiques d'une figure?


@ Mr.T Salut. En fait, je veux deux chiffres comme l'image que j'ai jointe. Je veux juste qu'ils soient adjacents l'un en dessous de l'autre. Vous avez également raison, j'utilise effectivement le notebook Jupyter.


Maintenant, cela devient déroutant. Une figure dans matplotlib est une entité différente d'un sous-graphique. Vous pouvez avoir plusieurs sous-graphiques dans une figure que vous pouvez organiser dans matplotlib. Ou vous pouvez avoir un sous-tracé dans chaque figure - mais pour organiser ces chiffres, vous devez indiquer au programme qui contrôle votre sortie, ce qui semble être dans votre cas Jupyter. Ces deux questions ("Comment organiser les sous-graphiques dans matplotlib" et "Comment organiser les figures dans Jupyter") sont distinctes car les réponses seront différentes. Alors, quelle question vous posez-vous? J'ai ajouté la balise Jupyter , au cas où ce serait la deuxième question.


@ Mr.TI je suis désolé si je fais de la confusion. Permettez-moi de le dire en termes simples, je veux que les deux sous-graphiques soient disposés côte à côte. Le% cumulé et la perte de rendement. Pour obtenir le% graphique cumulé, j'ai codé de # Trendline_change_2 jusqu'à la balise #plot, et pour le graphique ci-dessous, le code commence à #plot 2. Dans chaque figure, j'ai un graphique à barres, avec une fréquence sur l'axe gauche, et un ligne, qui montre la tendance, et cartographie avec l'axe Y droit. C'est la même chose pour les deux parcelles. J'espère que je n'utilise pas la terminologie de manière incorrecte.


3 Réponses :


0
votes

Normalement fig, (ax1, ax2) = plt.subplots(1, 2) devrait fonctionner fig, (ax1, ax2) = plt.subplots(1, 2) . Ensuite, vous créez vos figures en utilisant ax1 et ax2 comme vous l'avez fait.
Documentation


2 commentaires

Je ne sais pas si j'ai exactement compris ce que vous dites. Voici les modifications que j'ai apportées au lien et à la sortie [lien] ( imgur.com/a/jTSr6Wa ). Pouvez-vous indiquer où apporter les modifications correctes?


Ok c'est mieux, mais vous n'avez besoin que d'une seule figue, (ax1, ax2) = plt.subplots (1, 2), puisque vous la collez deux fois, vous avez 4 parcelles. Ensuite, vous utilisez ax1 pour créer le premier tracé et ax2 pour le deuxième tracé.



0
votes

Utilisation

plt.subplots(a,b)
fig, (ax1, ax2) = plt.subplots(1,2)

a - Nombre de parcelles dans chaque colonne

b - Nombre de parcelles dans chaque ligne

https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.pyplot.subplots.html

Consultez la documentation ci-dessus pour une meilleure compréhension.


2 commentaires

Je ne sais pas si j'ai exactement compris ce que vous dites. Voici les modifications que j'ai apportées au lien et à la sortie [lien] ( imgur.com/a/jTSr6Wa ). Pouvez-vous indiquer où apporter les modifications correctes?


J'ai vérifié votre code, je pense que vous avez écrit le même code deux fois. Supprimez le code sous "" "" #Plot 2 "" "" (qui est répétitif) et réessayez une fois.



1
votes

Il semble que l'environnement Jupyter avec affichage d'images en ligne rend difficile de comprendre pourquoi les figures et les sous-graphiques ne sont pas les mêmes. La réponse matplotlib à votre question a déjà été donnée - créez des sous - graphiques et remplissez-les:

import matplotlib.pyplot as plt
import numpy as np

#Figure 1
fig, ax1 = plt.subplots()
ax1.plot(np.arange(10), np.random.randint(1, 5, 10), c="blue")
ax2 = ax1.twinx()
ax2.plot(np.arange(5, 15), np.random.randint(10, 100, 10), c="red", label="Figure 1")
plt.legend()


#Figure 2
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(np.arange(10), np.random.randint(2,20, 10), c="grey")
ax2.plot(np.arange(5, 15), np.random.randint(-10, 0, 10), c="yellow", label="Figure 2")
plt.legend()
plt.show()

Cela crée une figure (pensez à une fenêtre ou une page) avec les deux sous-graphiques:

entrez la description de l'image ici

Votre approche consiste à créer deux figures individuelles, chacune contenant une sous-parcelle:

import matplotlib.pyplot as plt
import numpy as np

#Figure 1, 2 subplots
fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(10,5))

#subplot 1
ax1.plot(np.arange(10), np.random.randint(1, 5, 10), c="blue")
ax2 = ax1.twinx()
ax2.plot(np.arange(5, 15), np.random.randint(10, 100, 10), c="red", label="Subplot 1")
plt.legend(loc="best")

#subplot 2
ax4 = ax3.twinx()
ax3.plot(np.arange(10), np.random.randint(2,20, 10), c="grey")
ax4.plot(np.arange(5, 15), np.random.randint(-10, 0, 10), c="yellow", label="Subplot 2")

#now plot both subplots into one figure
plt.legend(loc="best")
plt.tight_layout()
plt.show()

Cela crée deux chiffres, comme prévu. Dans mon environnement, ce sont deux fenêtres:

entrez la description de l'image ici

Dans votre environnement (conjectures ici, car je ne connais pas Jupyter), l'impression en ligne met les deux figures sur des lignes séparées - par conséquent, elles apparaissent comme si vous aviez créé deux sous-graphiques disposés verticalement dans matplotlib.
En résumé, cela semble être une question de Jupyter - "Comment tracer des images en ligne côte à côte?", Pas une question matplotlib, si je vous comprends bien. Cela dit, ne serait-il pas plus facile de répondre à la question "Comment puis-je organiser des sous-graphiques dans matplotlib?" (vous avez déjà plusieurs réponses), puis tracez simplement un chiffre? Il est difficile de comprendre pourquoi vous avez besoin de deux chiffres et de les afficher côte à côte.


1 commentaires

SALUT. Je pense que vous m'avez donné une direction correcte et après quelques changements, je me sens beaucoup plus proche. Clôture de cette question, marquage de la vôtre correcte (je devrai faire une personnalisation en fonction de mes besoins). Merci beaucoup.