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

Les images partagent les axes X et Y

WBOY
Libérer: 2024-02-09 22:45:04
avant
861 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!

source:stackoverflow.com
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