Nota
Fare clic qui per scaricare il codice di esempio completo
Asinh Demo #
Illustrazione del asinh
ridimensionamento dell'asse, che utilizza la trasformazione
Per valori di coordinate vicini allo zero (cioè molto più piccoli della "larghezza lineare"\(a_0\)), ciò lascia sostanzialmente invariati i valori:
ma per valori maggiori (es\(|a| \gg a_0\), questo è asintotico
Come per lo symlog
scaling, ciò consente di tracciare quantità che coprono un intervallo dinamico molto ampio che include sia valori positivi che negativi. Tuttavia, symlog
comporta una trasformazione che presenta discontinuità nel suo gradiente perché è costruita da trasformazioni lineari e logaritmiche separate . Il asinh
ridimensionamento utilizza una trasformazione uniforme per tutti i valori (finiti), che è matematicamente più pulita e riduce gli artefatti visivi associati a una brusca transizione tra le regioni lineari e logaritmiche del grafico.
Nota
scale.AsinhScale
è sperimentale e l'API potrebbe cambiare.
Vedi AsinhScale
, SymmetricalLogScale
.
import numpy as np
import matplotlib.pyplot as plt
# Prepare sample values for variations on y=x graph:
x = np.linspace(-3, 6, 500)
Confronta il comportamento di "symlog" e "asinh" sul grafico campione y=x, dove c'è un gradiente discontinuo in "symlog" vicino a y=2:
fig1 = plt.figure()
ax0, ax1 = fig1.subplots(1, 2, sharex=True)
ax0.plot(x, x)
ax0.set_yscale('symlog')
ax0.grid()
ax0.set_title('symlog')
ax1.plot(x, x)
ax1.set_yscale('asinh')
ax1.grid()
ax1.set_title('asinh')
Text(0.5, 1.0, 'asinh')
Confronta i grafici "asinh" con diversi parametri di scala "linear_width":
fig2 = plt.figure(constrained_layout=True)
axs = fig2.subplots(1, 3, sharex=True)
for ax, (a0, base) in zip(axs, ((0.2, 2), (1.0, 0), (5.0, 10))):
ax.set_title('linear_width={:.3g}'.format(a0))
ax.plot(x, x, label='y=x')
ax.plot(x, 10*x, label='y=10x')
ax.plot(x, 100*x, label='y=100x')
ax.set_yscale('asinh', linear_width=a0, base=base)
ax.grid()
ax.legend(loc='best', fontsize='small')
Confronta il ridimensionamento "symlog" e "asinh" su numeri casuali 2D distribuiti da Cauchy, dove si possono vedere artefatti più sottili vicino a y=2 a causa della discontinuità del gradiente in "symlog":
fig3 = plt.figure()
ax = fig3.subplots(1, 1)
r = 3 * np.tan(np.random.uniform(-np.pi / 2.02, np.pi / 2.02,
size=(5000,)))
th = np.random.uniform(0, 2*np.pi, size=r.shape)
ax.scatter(r * np.cos(th), r * np.sin(th), s=4, alpha=0.5)
ax.set_xscale('asinh')
ax.set_yscale('symlog')
ax.set_xlabel('asinh')
ax.set_ylabel('symlog')
ax.set_title('2D Cauchy random deviates')
ax.set_xlim(-50, 50)
ax.set_ylim(-50, 50)
ax.grid()
plt.show()
Riferimenti
Tempo di esecuzione totale dello script: (0 minuti 2,229 secondi)