带有对数刻度的更好的刻度和刻度标签

ger*_*erm 5 matplotlib

我正在尝试获得更好看的双对数图,除了一个小问题之外,我几乎得到了我想要的。

我的示例偏离标准设置的原因是 x 值限制在不到十年的范围内,并且我想使用十进制,而不是科学记数法。

请允许我用一个例子来说明:

import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib as mpl
import numpy as np

x = np.array([0.6,0.83,1.1,1.8,2])
y = np.array([1e-5,1e-4,1e-3,1e-2,0.1])

fig1,ax = plt.subplots()
ax.plot(x,y)
ax.set_xscale('log')
ax.set_yscale('log')
Run Code Online (Sandbox Code Playgroud)

其产生:

图。1

x 轴有两个问题:

  1. 使用科学计数法,在这种情况下会适得其反

  2. 右下角可怕的“偏移”

经过大量阅读后,我添加了三行代码:

ax.xaxis.set_major_formatter(mpl.ticker.ScalarFormatter())
ax.xaxis.set_minor_formatter(mpl.ticker.ScalarFormatter())
ax.ticklabel_format(style='plain',axis='x',useOffset=False)
Run Code Online (Sandbox Code Playgroud)

这会产生:

图2

我对此的理解是,有 5 个小刻度和 1 个大刻度。它好多了,但仍然不完美:

  1. 我想要 1 到 2 之间的一些额外刻度
  2. 1 处的标签格式错误。应该是“1.0”

所以我在格式化语句之前插入了以下行:

ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(0.2))
Run Code Online (Sandbox Code Playgroud)

我终于得到了我想要的刻度:

图3

我现在有 8 个主要刻度和 2 个次要刻度。现在,这看起来几乎是正确的,除了 0.6、0.8 和 2.0 处的刻度标签比其他刻度标签显得更粗这一事实之外。这是什么原因?我该如何纠正?

Imp*_*est 6

某些标签显示为粗体的原因是它们是主要刻度标签和次要刻度标签的一部分。如果两个文本完全重叠,它们会由于抗锯齿而显得更粗。
您可能决定仅使用次要刻度标签并使用NullLocator.

由于您希望拥有的刻度标签的位置非常具体,因此没有自动定位器可以开箱即用地提供它们。对于这种特殊情况,最简单的方法可能是使用 aFixedLocator并指定您希望作为列表的标签。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np

x = np.array([0.6,0.83,1.1,1.8,2])
y = np.array([1e-5,1e-4,1e-3,1e-2,0.1])

fig1,ax = plt.subplots(dpi=72, figsize=(6,4))
ax.plot(x,y)
ax.set_xscale('log')
ax.set_yscale('log')

locs = np.append( np.arange(0.1,1,0.1),np.arange(1,10,0.2))
ax.xaxis.set_minor_locator(ticker.FixedLocator(locs))
ax.xaxis.set_major_locator(ticker.NullLocator())

ax.xaxis.set_minor_formatter(ticker.ScalarFormatter())

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

对于更通用的标签,当然可以对定位器进行子类化,但是我们需要知道用于确定刻度标签的逻辑。(由于我没有看到问题中所需的刻度的明确定义的逻辑,我觉得现在提供这样的解决方案是浪费精力。)