我想用matplotlib制作方轴散点图。通常使用set_scale("log")
效果很好,但它限制我使用log10。我想在log2中制作情节。我在这里看到了解决方案:How to produce an exponentially scaled axis?
但它非常复杂,如果您的数组中有0个值,则不起作用,我这样做。我想简单地忽略像其他numpy函数那样的东西。
例如:
log2scatter(data1, data2)
其中data1和data2包含0应该在x和y轴上具有对数刻度,具有对数间隔刻度。就像log10一样,除了log2 ......
感谢。
答案 0 :(得分:38)
只需指定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()
对于过零行为,你所指的是“对称日志”图(a.k.a。“symlog”)。无论它的价值如何,数据都不会被滤除,它只是0附近的线性图和其他地方的对数图。这是变化的规模,而不是数据。
通常情况下,您只需执行ax.set_xscale('symlog', basex=2)
但是使用非10碱基似乎是目前symlog图的错误。
修改强>:
嘿!该错误似乎是由于一个经典错误:使用可变的默认参数
我已经提交了错误报告,但是如果您想要修复它,则需要使用lib/matplotlib/ticker.py
__init__
方法对第1376行SymmetricalLogLocator
进行一次小修改
而不是
def __init__(self, transform, subs=[1.0]):
self._transform = transform
self._subs = subs
...
将其更改为类似于:
def __init__(self, transform, subs=None):
self._transform = transform
if subs is None:
self._subs = [1.0]
else:
self._subs = subs
....
如果进行了更改,它的行为与预期相符......
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()
答案 1 :(得分:4)
如果您使用plt.xscale
,则仍需指定basex
,而不是base
:
plt.figure()
plt.plot(x, y)
plt.xscale('log', basex=2)
plt.show()