Gráfico de dispersão com histogramas #

Mostre as distribuições marginais de um gráfico de dispersão como histogramas nas laterais do gráfico.

Para um bom alinhamento dos eixos principais com as marginais, duas opções são mostradas abaixo:

Embora Axes.inset_axespossa ser um pouco mais complexo, permite o manuseio correto dos eixos principais com uma proporção fixa.

Um método alternativo para produzir uma figura semelhante usando o axes_grid1 kit de ferramentas é mostrado no exemplo Scatter Histogram (Locatable Axes) . Finalmente, também é possível posicionar todos os eixos em coordenadas absolutas usando Figure.add_axes(não mostrado aqui).

Vamos primeiro definir uma função que recebe dados x e y como entrada, bem como três eixos, os eixos principais para a dispersão e dois eixos marginais. Em seguida, ele criará a dispersão e os histogramas dentro dos eixos fornecidos.

import numpy as np
import matplotlib.pyplot as plt

# Fixing random state for reproducibility
np.random.seed(19680801)

# some random data
x = np.random.randn(1000)
y = np.random.randn(1000)


def scatter_hist(x, y, ax, ax_histx, ax_histy):
    # no labels
    ax_histx.tick_params(axis="x", labelbottom=False)
    ax_histy.tick_params(axis="y", labelleft=False)

    # the scatter plot:
    ax.scatter(x, y)

    # now determine nice limits by hand:
    binwidth = 0.25
    xymax = max(np.max(np.abs(x)), np.max(np.abs(y)))
    lim = (int(xymax/binwidth) + 1) * binwidth

    bins = np.arange(-lim, lim + binwidth, binwidth)
    ax_histx.hist(x, bins=bins)
    ax_histy.hist(y, bins=bins, orientation='horizontal')

Definindo as posições dos eixos usando um gridspec #

Definimos um gridspec com proporções desiguais de largura e altura para obter o layout desejado. Veja também o tutorial Organizando múltiplos eixos em uma figura .

# Start with a square Figure.
fig = plt.figure(figsize=(6, 6))
# Add a gridspec with two rows and two columns and a ratio of 1 to 4 between
# the size of the marginal axes and the main axes in both directions.
# Also adjust the subplot parameters for a square plot.
gs = fig.add_gridspec(2, 2,  width_ratios=(4, 1), height_ratios=(1, 4),
                      left=0.1, right=0.9, bottom=0.1, top=0.9,
                      wspace=0.05, hspace=0.05)
# Create the Axes.
ax = fig.add_subplot(gs[1, 0])
ax_histx = fig.add_subplot(gs[0, 0], sharex=ax)
ax_histy = fig.add_subplot(gs[1, 1], sharey=ax)
# Draw the scatter plot and marginals.
scatter_hist(x, y, ax, ax_histx, ax_histy)
espalhar hist

Definindo as posições dos eixos usando insert_axes #

inset_axespode ser usado para posicionar marginais fora dos eixos principais. A vantagem de fazer isso é que a proporção dos eixos principais pode ser fixada e as margens sempre serão desenhadas em relação à posição dos eixos.

# Create a Figure, which doesn't have to be square.
fig = plt.figure(constrained_layout=True)
# Create the main axes, leaving 25% of the figure space at the top and on the
# right to position marginals.
ax = fig.add_gridspec(top=0.75, right=0.75).subplots()
# The main axes' aspect can be fixed.
ax.set(aspect=1)
# Create marginal axes, which have 25% of the size of the main axes.  Note that
# the inset axes are positioned *outside* (on the right and the top) of the
# main axes, by specifying axes coordinates greater than 1.  Axes coordinates
# less than 0 would likewise specify positions on the left and the bottom of
# the main axes.
ax_histx = ax.inset_axes([0, 1.05, 1, 0.25], sharex=ax)
ax_histy = ax.inset_axes([1.05, 0, 0.25, 1], sharey=ax)
# Draw the scatter plot and marginals.
scatter_hist(x, y, ax, ax_histx, ax_histy)

plt.show()
espalhar hist

Referências

O uso das seguintes funções, métodos, classes e módulos é mostrado neste exemplo:

Tempo total de execução do script: ( 0 minutos 1,217 segundos)

Galeria gerada por Sphinx-Gallery