import matplotlib.pyplot as plt
from typing import Optional
def restore_minor_ticks_log_plot(
ax: Optional[plt.Axes] = None, n_subticks=9
) -> None:
"""For axes with a logrithmic scale where the span (max-min) exceeds
10 orders of magnitude, matplotlib will not set logarithmic minor ticks.
If you don't like this, call this function to restore minor ticks.
Args:
ax:
n_subticks: Number of Should be either 4 or 9.
Returns:
None
"""
if ax is None:
ax = plt.gca()
# Method from SO user importanceofbeingernest at
# https://stackoverflow.com/a/44079725/5972175
locmaj = mpl.ticker.LogLocator(base=10, numticks=1000)
ax.xaxis.set_major_locator(locmaj)
locmin = mpl.ticker.LogLocator(
base=10.0, subs=np.linspace(0, 1.0, n_subticks + 2)[1:-1], numticks=1000
)
ax.xaxis.set_minor_locator(locmin)
ax.xaxis.set_minor_formatter(mpl.ticker.NullFormatter())
from matplotlib import pyplot as plt, ticker as mticker
fig, ax = plt.subplots()
y = np.arange(11)
x = 10.0**y
ax.semilogx(x, y)
ax.xaxis.set_major_locator(mticker.LogLocator(numticks=999))
ax.xaxis.set_minor_locator(mticker.LogLocator(numticks=999, subs="auto"))
手动设置接头
from matplotlib import pyplot as plt, ticker as mticker
fig, ax = plt.subplots()
y = np.arange(12)
x = 10.0**y
ax.semilogx(x, y)
ax.xaxis.set_major_locator(mticker.LogLocator(numticks=999))
ax.xaxis.set_minor_locator(mticker.LogLocator(numticks=999, subs=(.2, .4, .6, .8)))
5条答案
按热度按时间bq3bfh9z1#
matplotlib的解决方案〉= 2.0.2
让我们考虑以下示例
它由以下代码生成:
次要的ticklabel确实消失了,通常显示它们的方法(如
plt.tick_params(axis='x', which='minor')
)失败了。第一步是在轴上显示10的所有幂,
其中技巧是将
numticks
设置为等于或大于滴答数的数(即,在这种情况下为12或更大)。然后,我们可以将次要刻度标签添加为
请注意,我将其限制为每十进位包含4个小刻度(使用8也是可能的,但在本例中会使轴过于拥挤)。
最后,我们需要对次要刻度使用
NullFormatter()
,以便不为它们显示任何刻度标签。matplotlib 2.0.0的解决方案
让我们考虑以下示例
它由以下代码生成:
次要的ticklabel确实消失了,通常显示它们的方法(如
plt.tick_params(axis='x', which='minor')
)失败了。第一步是在轴上显示10的所有幂,
x1c4d 1x指令集
然后,我们可以将次要刻度标签添加为
请注意,我将其限制为每10年包含4个小刻度(使用8个小刻度也是可能的,但在本例中会使轴过于拥挤)。还要注意--这可能是这里的关键--
subs
参数(它给出了放置刻度的基数的整数幂的倍数(参见文档))被给出了一个20年而不是1年的列表。最后,我们需要对次要刻度使用
NullFormatter()
,以便不为它们显示任何刻度标签。guz6ccqo2#
带有空标签的主要记号将生成记号,但不生成标签。
hmae6n7t3#
将
matplotlib >= 2.0.2
的importanceofbeingernest中的excellent answer Package 到函数中:然后,可以将此函数调用为
或更明确地
ykejflvf4#
据我所知,截至Matplotlib 3.5.2:
subs="auto"
将显示次要刻度线subs
。使用
subs="auto"
手动设置接头
ktca8awb5#
这里的答案忽略了一个方便的事实,即对数坐标轴已经有了必要的定位器。至少在Matplotlib 3.6中,使用
set_params()
和强制小刻度的值就足够了: