首页 > 解决方案 > 将 drawstyle "steps-mid" 与 x-log-scale 一起使用会导致步进点不居中

问题描述

Matplotlib 为drawstyle提供了各种选项。steps-mid执行以下操作:

阶梯变体将点与阶梯状线连接,即水平线与垂直阶梯。[...]
'steps-mid':步长在两点之间。

当 x 尺度是线性的时,这很好用,但是当使用对数尺度时,它似乎仍然通过在数据空间而不是对数空间中求平均来计算步长点。这导致数据点不在步骤之间居中。

import matplotlib.pyplot as plt
import numpy as np

x = np.logspace(0, 10, num=10)
y = np.arange(x.size) % 2

fig, ax = plt.subplots()
ax.set_xscale('log')
ax.plot(x, y, drawstyle='steps-mid', marker='s')

阴谋

有没有一种方法可以将阶梯状绘图与 x-log-scale 一起使用,以使阶梯居中于对数空间中的数据点之间?

标签: pythonpython-3.xmatplotlib

解决方案


除了自己在日志空间中正确构建步骤之外,我不知道其他方法:

import matplotlib.pyplot as plt
import numpy as np

x = np.logspace(0, 10, num=10)
y = np.arange(x.size) % 2


def log_steps_mid(x, y, **kwargs):
    x_log = np.log10(x)
    x_log_mid = x_log[:-1] + np.diff(x_log)/2
    x_mid = 10 ** x_log_mid
    x_mid = np.hstack([x[0],
                       np.repeat(x_mid, 2),
                       x[-1]])
    y_mid = np.repeat(y, 2)
    ax.plot(x_mid, y_mid, **kwargs)


fig, ax = plt.subplots()
ax.set_xscale('log')
ax.plot(x, y, ls='', marker='s', color='b')
log_steps_mid(x, y, color='b')


正确的日志步骤-mid


推荐阅读