python - real - matplotlib title
Haciendo parcelas de ejes cuadrados con log2 escalas en matplotlib (2)
Me gustaría hacer un diagrama de dispersión de eje cuadrado con matplotlib. Normalmente, usar set_scale("log")
funciona muy bien, pero me limita a log10. Me gustaría hacer la trama en log2. Vi la solución aquí: ¿Cómo producir un eje escalado exponencialmente?
pero es bastante complicado y no funciona si tienes 0 valores en tus arreglos, lo que yo hago. Me gustaría simplemente ignorar aquellas que hacen otras funciones numpy.
Por ejemplo:
log2scatter(data1, data2)
donde data1 y data2 contienen 0s deben tener una escala logarítmica en los ejes x e y, con marcas logarítmicas espaciadas. Al igual que log10, excepto log2 ...
Gracias.
Si está utilizando plt.xscale
, todavía necesita especificar basex
, no base
:
plt.figure()
plt.plot(x, y)
plt.xscale(''log'', basex=2)
plt.show()
Simplemente especifique basex=2
o basey=2
.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.set_xscale(''log'', basex=2)
ax.set_yscale(''log'', basey=2)
ax.plot(range(1024))
plt.show()
Para el comportamiento de cruce por cero, a lo que te refieres es a un gráfico de "Registro Simétrico" (también conocido como "symlog"). Para lo que valga la pena, los datos no se filtran, es solo un gráfico lineal cerca de 0 y un gráfico de registro en cualquier otro lugar. Es la escala que cambia, no los datos.
Normalmente, solo harías ax.set_xscale(''symlog'', basex=2)
pero el uso de una base que no sea 10 parece tener errores en el momento para los diagramas de symlog.
Edit : ¡Heh! El error parece deberse a un error clásico: utilizar un argumento predeterminado mutable.
He presentado un informe de error, pero si tiene ganas de solucionarlo, deberá realizar una edición menor de lib/matplotlib/ticker.py
, alrededor de la línea 1376, en el método __init__
de SymmetricalLogLocator
.
En lugar de
def __init__(self, transform, subs=[1.0]):
self._transform = transform
self._subs = subs
...
Cambiarlo a algo similar a:
def __init__(self, transform, subs=None):
self._transform = transform
if subs is None:
self._subs = [1.0]
else:
self._subs = subs
....
Con ese cambio realizado, se comporta como se espera ...
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
ax.set_xscale(''symlog'', basex=2)
ax.set_yscale(''symlog'', basey=2)
x = np.arange(-1024, 1024)
ax.plot(x, x)
plt.show()