21 python numpy matplotlib scipy
我想用matplotlib制作方轴散点图.通常使用set_scale("log")效果很好,但它限制我使用log10.我想在log2中制作情节.我在这里看到了解决方案:如何生成指数缩放轴?
但它很复杂,如果你的数组中有0个值,则不起作用.我想简单地忽略那些像其他numpy函数那样的东西.
例如:
log2scatter(data1, data2)
Run Code Online (Sandbox Code Playgroud)
其中data1和data2包含0应该在x和y轴上具有对数刻度,具有对数间隔刻度.就像log10一样,除了log2 ......
谢谢.
Joe*_*ton 41
只需指定basex=2或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()
Run Code Online (Sandbox Code Playgroud)

对于过零行为,您所指的是"对称日志"图(也称为"symlog").无论它的价值如何,数据都不会被滤除,它只是0附近的线性图和其他地方的对数图.它是变化的规模,而不是数据.
通常情况下你只是这样,ax.set_xscale('symlog', basex=2)但是对于symlog图,目前使用非10基本似乎是错误的.
编辑:嘿!该错误似乎是由于一个经典错误:使用可变的默认参数.
我已经提交了一个错误报告,但是如果你想修复它,你需要lib/matplotlib/ticker.py在第1376行的__init__方法中进行一次小修改SymmetricalLogLocator.
代替
def __init__(self, transform, subs=[1.0]):
self._transform = transform
self._subs = subs
...
Run Code Online (Sandbox Code Playgroud)
将其更改为类似于:
def __init__(self, transform, subs=None):
self._transform = transform
if subs is None:
self._subs = [1.0]
else:
self._subs = subs
....
Run Code Online (Sandbox Code Playgroud)
随着这种变化,它的行为符合预期......
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()
Run Code Online (Sandbox Code Playgroud)

如果使用plt.xscale,则仍需要指定basex,而不是base:
plt.figure()
plt.plot(x, y)
plt.xscale('log', basex=2)
plt.show()
Run Code Online (Sandbox Code Playgroud)