tiempo real matrices graficos graficas graficar python numpy scipy matplotlib

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()