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