numpy 在matplotlib中用log2标度绘制方轴图

esyap4oy  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(121)

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

b91juud3

b91juud31#

Matplotlib >= 3.3

指定base=2

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.set_xscale('log', base=2)
ax.set_yscale('log', base=2)

ax.plot(range(1024))
plt.show()

字符串

Matplotlib < 3.3

指定basex=2和/或basey=2作为x轴和y轴。

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


x1c 0d1x的数据
对于过零行为,您所指的是“对称对数”图(也称为“symlog”)。无论如何,数据不会被过滤掉,它只是一个接近0的线性图和其他地方的对数图。改变的是尺度,而不是数据。
通常情况下,您只需执行ax.set_xscale('symlog', basex=2),但使用非10的基数在目前的symlog图中似乎存在错误。

编辑:嘿!这个bug似乎是由于一个经典的错误:使用了一个可变的默认参数。

我已经提交了一个bug报告,但是如果你想修复它,你需要在SymmetricalLogLocator__init__方法的第1376行附近对lib/matplotlib/ticker.py做一个小的编辑。
而不是

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


drkbr07n

drkbr07n2#

如果你使用plt.xscale,你仍然需要指定basex,而不是base

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

字符串

相关问题