Note
Go to the end to download the full example code
Scatter plot with histograms
To create a scatter plot with histograms at the sides of the plot one
can use pygmt.Figure.plot
in combination with
pygmt.Figure.histogram
. The positions of the histograms are plotted
by offsetting them from the main scatter plot figure using
pygmt.Figure.shift_origin
.
import numpy as np
import pygmt
# Generate random data from a standard normal distribution centered on 0
# with a standard deviation of 1
rng = np.random.default_rng(seed=19680801)
x = rng.normal(loc=0, scale=1, size=1000)
y = rng.normal(loc=0, scale=1, size=1000)
# Get axis limits
xymax = max(np.max(np.abs(x)), np.max(np.abs(y)))
fig = pygmt.Figure()
fig.basemap(
region=[-xymax - 0.5, xymax + 0.5, -xymax - 0.5, xymax + 0.5],
projection="X10c/10c",
frame=["WSrt", "a1"],
)
fillcol = "seagreen"
# Plot data points as circles with a diameter of 0.15 centimeters
fig.plot(x=x, y=y, style="c0.15c", fill=fillcol, transparency=50)
# Shift the plot origin and add top margin histogram
fig.shift_origin(yshift="10.25c")
fig.histogram(
projection="X10c/2c",
frame=["Wsrt", "xf1", "y+lCounts"],
# Give the same value for ymin and ymax to have ymin and ymax
# calculated automatically
region=[-xymax - 0.5, xymax + 0.5, 0, 0],
data=x,
fill=fillcol,
pen="0.1p,white",
histtype=0,
series=0.1,
)
# Shift the plot origin and add right margin histogram
fig.shift_origin(yshift="-10.25c", xshift="10.25c")
fig.histogram(
horizontal=True,
projection="X2c/10c",
# Note that the y-axis annotation "Counts" is shown in x-axis direction
# due to the rotation caused by horizontal=True
frame=["wSrt", "xf1", "y+lCounts"],
region=[-xymax - 0.5, xymax + 0.5, 0, 0],
data=y,
fill=fillcol,
pen="0.1p,white",
histtype=0,
series=0.1,
)
fig.show()
Total running time of the script: (0 minutes 0.265 seconds)