Python 在matplotlib中使用log2比例绘制方轴图

Python 在matplotlib中使用log2比例绘制方轴图,python,numpy,scipy,matplotlib,Python,Numpy,Scipy,Matplotlib,我想用matplotlib做一个方轴散点图。通常使用set\u scale(“log”)效果很好,但它将我限制在log10。我想在log2中绘制情节。我在这里看到了解决方案: 但是,如果数组中有0个值,它就相当复杂,而且不起作用,我就是这么做的。我想简单地忽略这些,就像其他numpy函数一样 例如: log2scatter(data1, data2) 如果数据1和数据2包含0,则在x轴和y轴上应具有对数刻度,并带有对数间隔的记号。就像log10一样,除了log2 谢谢。只需指定basex=2或

我想用matplotlib做一个方轴散点图。通常使用
set\u scale(“log”)
效果很好,但它将我限制在log10。我想在log2中绘制情节。我在这里看到了解决方案:

但是,如果数组中有0个值,它就相当复杂,而且不起作用,我就是这么做的。我想简单地忽略这些,就像其他numpy函数一样

例如:

log2scatter(data1, data2)
如果数据1和数据2包含0,则在x轴和y轴上应具有对数刻度,并带有对数间隔的记号。就像log10一样,除了log2


谢谢。

只需指定
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()

对于过零行为,您所指的是“对称对数”图(也称为“symlog”)。不管它值多少钱,数据都不会被过滤掉,它只是一个接近0的线性图和其他地方的对数图。改变的是尺度,而不是数据

通常,您只需执行ax.setxscale('symlog',basex=2),但对于symlog绘图,使用非10基数似乎有问题

编辑: 嘿!该错误似乎是由于一个典型错误造成的:使用可变的默认参数。
我已经提交了一个bug报告,但是如果您想修复它,您需要在
Symmetricallogocator
\uuuu init\uuuu
方法中对第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()

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

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

日志仅为正参数定义。这适用于不考虑基数的情况,即适用于自然对数、对数基数10、对数基数2等。因此,除非对这些零值进行处理,否则无法绘制对数刻度中有零的图形。使用该问题的答案,但首先过滤掉0的y值及其对应的x值(这就是numpy忽略它们的原因)。在numpy中实现这一点的优雅方式是什么?过滤使代码复杂化,因为现在我必须对数组的一个副本进行未过滤,并且对一个副本进行过滤…我使用base=2得到了非常奇怪的默认x和y限制(实际上甚至没有它)。它没有将其设置为两个维度中的最小值。它选择了隐藏大部分数据的非常奇怪的限制。除了手动设置x/y限制之外,如何解决这一问题?不必重写/破解matplotlib中的类,以在log2与log2中绘制一个奇怪的散点图……这太令人伤心和沮丧了(symlog部分是一个bug。您所指的限制只是日志图中限制的行为方式。它们“捕捉”到最接近的基数幂。如果您希望限制严格以数据的最小值和最大值结束,请指定
ax.axis('tight'))
。在
matplotlib>=3.3
中使用
base=2
,而不是
basex=2
basey=2