Maison > développement back-end > Tutoriel Python > Les images partagent les axes X et Y

Les images partagent les axes X et Y

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2024-02-09 22:45:04
avant
923 Les gens l'ont consulté

Les images partagent les axes X et Y

Contenu de la question

J'ai une image affichée à l'aide de imshow. Ensuite, j'ajoute toutes les lignes et affiche la valeur maximale. Je fais la même chose avec les colonnes. Dans le graphique d'affichage, je souhaite que les axes x et y de l'image coïncident avec l'axe x des colonnes ajoutées et l'axe y des lignes ajoutées. Cependant, malgré le réglage de sharexsharey séparément, cela ne semble pas fonctionner. J'aimerais pouvoir n'en faire qu'un à la fois :

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
import matplotlib.animation as animation

fig=        plt.figure()
gs=         fig.add_gridspec(2,2, height_ratios=[1, 0.1], width_ratios=[1, 0.1], hspace=0, wspace=0)
ax1=        fig.add_subplot(gs[0,0])
ax2=        fig.add_subplot(gs[1,0], sharex=ax1)
ax3=        fig.add_subplot(gs[0,1], sharey=ax1)
frameNumber= 10
imgs=   []

for i in range(frameNumber):
    np.random.seed(i)
    randomImage= np.random.random((5,5))
    sumX=   np.sum(randomImage, axis=0)
    sumY=   np.sum(randomImage, axis=1)
    dataRange=  np.arange(len(sumX))
    randomDataSet=  np.random.random((10))
    randomMaximalX= argrelextrema(sumX, np.greater)
    randomMaximalY= argrelextrema(sumY, np.greater)

    img1=   ax1.imshow(randomImage, animated=True)
    img2=   ax2.plot(dataRange, sumX,animated=True)[0]
    img3=   ax3.plot(sumY,dataRange,animated=True)[0]
    img4=   ax2.vlines(x=randomMaximalX, ymin=0, ymax=5, animated=True, linestyles="dashed")
    img5=   ax3.hlines(y=randomMaximalY, xmin=0, xmax=5, animated=True, linestyles="dashed")
    imgs.append([img1, img2, img3, img4, img5])
ani=    animation.ArtistAnimation(fig, imgs, interval=1000, blit=False)
plt.show()
Copier après la connexion

Le résultat actuel est le suivant :

En fait, je veux quelque chose comme ça :

Les valeurs h des deux graphiques sont les mêmes. Merci beaucoup!


Bonne réponse


Il existe deux façons de résoudre ce problème :

  1. Utilisez axes.pcolormesh 代替 axes.imshow
  2. Ou mettez à jour le rapport hauteur/largeur des images adjacentes.

① axis.pcolormesh

axes.pcolormesh ne force pas l'image générée à être carrée (rapport hauteur/largeur 1:1), donc vos cellules seront rectangulaires, mais elles rempliront l'espace prévu de manière appropriée.

from numpy.random import default_rng
import matplotlib.pyplot as plt

rng = default_rng(0)
image = rng.uniform(1, 10, size=(5, 5))

mosaic = [
    ['main',   'right'],
    ['bottom', '.'    ],
]

fig, axd = plt.subplot_mosaic(
    mosaic,
    gridspec_kw={
        'height_ratios': [1, .1], 'width_ratios': [1, .1],
        'wspace': .05, 'hspace': .05,
    },
    sharex=true,
    sharey=true,
)

axd['main'].pcolormesh(image)

plt.show()
Copier après la connexion

② Mises à jour

Si vous voulez vous en tenir à axes.imshow, vous devez vous adapter Ajustez manuellement le rapport hauteur/largeur de chaque tracé. Pour obtenir le bon ratio dont vous avez besoin Calculé gridspecheight_ratiowidth_ratio sur la base des informations fournies à

from numpy.random import default_rng
import matplotlib.pyplot as plt

rng = default_rng(0)
image = rng.uniform(1, 10, size=(5, 5))

mosaic = [
    ['main',   'right'],
    ['bottom', '.'    ],
]

fig, axd = plt.subplot_mosaic(
    mosaic,
    sharex=True,
    sharey=True,
    gridspec_kw={
        'height_ratios': [1, .1], 'width_ratios': [1, .1],

        # change values to move adjacent plots closer to the main
        'wspace': .05, 'hspace': .05,
    },
)

axd['main'].imshow(image)
axd['main'].set_anchor('SE') # move main plot to bottom-right of bounding-box

# calculate the width and height scales
gs = axd['main'].get_gridspec() # you can also save these values from your `gridspec_kw`
width_scale = gs.get_width_ratios()[0]    / gs.get_width_ratios()[1]
height_scale = gs.get_height_ratios()[0]  / gs.get_height_ratios()[1]

# update the aspect ratios of the adjacent plots
#   set their anchors so they correctly align with the main plot
axd['right'].set_aspect(width_scale, anchor='SW')
axd['bottom'].set_aspect(1/height_scale, anchor='NE')

plt.show()
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal