在matplotlib中使用log2刻度制作方轴图

时间:2012-01-16 23:03:54

标签: python numpy scipy matplotlib

我想用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 ......

感谢。

2 个答案:

答案 0 :(得分:38)

只需指定basex=2basey=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()

enter image description here

对于过零行为,你所指的是“对称日志”图(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()

enter image description here

答案 1 :(得分:4)

如果您使用plt.xscale,则仍需指定basex,而不是base

plt.figure()
plt.plot(x, y)
plt.xscale('log', basex=2)
plt.show()