Python 在matplotlib中使用log2比例绘制方轴图
我想用matplotlib做一个方轴散点图。通常使用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或
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
。