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

21 python numpy matplotlib scipy

我想用matplotlib制作方轴散点图.通常使用set_scale("log")效果很好,但它限制我使用log10.我想在log2中制作情节.我在这里看到了解决方案:如何生成指数缩放轴?

但它很复杂,如果你的数组中有0个值,则不起作用.我想简单地忽略那些像其他numpy函数那样的东西.

例如:

log2scatter(data1, data2)
Run Code Online (Sandbox Code Playgroud)

其中data1和data2包含0应该在x和y轴上具有对数刻度,具有对数间隔刻度.就像log10一样,除了log2 ......

谢谢.

Joe*_*ton 41

只需指定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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

对于过零行为,您所指的是"对称日志"图(也称为"symlog").无论它的价值如何,数据都不会被滤除,它只是0附近的线性图和其他地方的对数图.它是变化的规模,而不是数据.

通常情况下你只是这样,ax.set_xscale('symlog', basex=2)但是对于symlog图,目前使用非10基本似乎是错误的.

编辑:嘿!该错误似乎是由于一个经典错误:使用可变的默认参数.
我已经提交了一个错误报告,但是如果你想修复它,你需要lib/matplotlib/ticker.py在第1376行的__init__方法中进行一次小修改SymmetricalLogLocator.

代替

def __init__(self, transform, subs=[1.0]):
    self._transform = transform
    self._subs = subs
    ...
Run Code Online (Sandbox Code Playgroud)

将其更改为类似于:

def __init__(self, transform, subs=None):
    self._transform = transform
    if subs is None:
        self._subs = [1.0]
    else:
        self._subs = subs
    ....
Run Code Online (Sandbox Code Playgroud)

随着这种变化,它的行为符合预期......

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 在“matplotlib >= 3.3”中使用“base=2”,而不是“basex=2”和“basey=2”。 (14认同)

Jor*_*tao 5

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

plt.figure()
plt.plot(x, y)
plt.xscale('log', basex=2)
plt.show()
Run Code Online (Sandbox Code Playgroud)

  • plt.xscale('log', base=2) 为我工作 (5认同)