如何在不使用 matplotlib 中的对数刻度进行标记的情况下指定次刻度位置?
How to specify minor tick location without labeling using logarithmic scale in matplotlib?
我正在尝试制作一个图,其中 x-axis 上的主要刻度被视为每隔三分之一 x-value(即索引模 3)并且相应的次要刻度是可见的,没有标签。这在线性刻度中不是问题,但使用对数刻度似乎可以改变这一点。我无法使用对数 x-data 找到正确的解决方案。我的实际用例是在同一个图上叠加线性和对数刻度(即,底部和左轴对应线性刻度,顶部和右轴对应对数刻度。但是,我的具体问题是删除 xticklabels 沿小刻度x-axis。下面是一个例子。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
x = 2**np.linspace(1, 16, 16).astype(int) ## LOGARITHMIC X-DATA
y = np.exp(x) / x**2 ## ARBITRARY Y-DATA
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xscale('log', basex=2)
ax.xaxis.set_major_formatter(ScalarFormatter()) ## REMOVE SCIENTIFIC NOTATION FOR LABELS
ax.set_xticks(x[::3]) ## MAJOR
ax.set_xticks([x[idx] for idx in range(len(x)) if idx % 3 != 0], minor=True) ## MINOR
ax.tick_params(axis='x', colors='gray', labelsize=7)
ax.xaxis.tick_top()
ax.xaxis.set_label_position('top')
ax.set_xlim(min(x)-1, max(x)+1)
plt.show()
plt.close(fig)
上面的代码产生了这个情节。
我正在尝试将解决方案应用到我的实际用例中,如下图。
如何在删除次要刻度标签的同时保留主要刻度?我想让小刻度在没有标签的情况下可见。
如果我没理解错的话,您正在寻找类似下面的内容。这里有几件事:
- 您需要定义一个
twiny
轴才能获得上方的 x 轴。
- 然后使用
plt.setp()
隐藏双轴的次刻度标签
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
x = 2**np.linspace(1, 16, 16).astype(int) ## LOGARITHMIC X-DATA
y = np.exp(x) / x**2 ## ARBITRARY Y-DATA
fig = plt.figure()
ax = fig.add_subplot(111)
ax2 = ax.twiny()
ax2.set_xscale('log', basex=2)
ax2.xaxis.set_major_formatter(ScalarFormatter()) ## REMOVE SCIENTIFIC NOTATION FOR LABELS
ax2.set_xticks(x[::3]) ## MAJOR
ax2.set_xticks([x[idx] for idx in range(len(x)) if idx % 3 != 0], minor=True) ## MINOR
ax2.tick_params(axis='x', colors='gray', labelsize=7)
plt.setp(ax2.get_xminorticklabels(), visible=False) # Grab the ticks and hide them
ax2.set_xlim(min(x)-1, max(x)+1)
我正在尝试制作一个图,其中 x-axis 上的主要刻度被视为每隔三分之一 x-value(即索引模 3)并且相应的次要刻度是可见的,没有标签。这在线性刻度中不是问题,但使用对数刻度似乎可以改变这一点。我无法使用对数 x-data 找到正确的解决方案。我的实际用例是在同一个图上叠加线性和对数刻度(即,底部和左轴对应线性刻度,顶部和右轴对应对数刻度。但是,我的具体问题是删除 xticklabels 沿小刻度x-axis。下面是一个例子。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
x = 2**np.linspace(1, 16, 16).astype(int) ## LOGARITHMIC X-DATA
y = np.exp(x) / x**2 ## ARBITRARY Y-DATA
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xscale('log', basex=2)
ax.xaxis.set_major_formatter(ScalarFormatter()) ## REMOVE SCIENTIFIC NOTATION FOR LABELS
ax.set_xticks(x[::3]) ## MAJOR
ax.set_xticks([x[idx] for idx in range(len(x)) if idx % 3 != 0], minor=True) ## MINOR
ax.tick_params(axis='x', colors='gray', labelsize=7)
ax.xaxis.tick_top()
ax.xaxis.set_label_position('top')
ax.set_xlim(min(x)-1, max(x)+1)
plt.show()
plt.close(fig)
上面的代码产生了这个情节。
我正在尝试将解决方案应用到我的实际用例中,如下图。
如何在删除次要刻度标签的同时保留主要刻度?我想让小刻度在没有标签的情况下可见。
如果我没理解错的话,您正在寻找类似下面的内容。这里有几件事:
- 您需要定义一个
twiny
轴才能获得上方的 x 轴。 - 然后使用
plt.setp()
隐藏双轴的次刻度标签
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
x = 2**np.linspace(1, 16, 16).astype(int) ## LOGARITHMIC X-DATA
y = np.exp(x) / x**2 ## ARBITRARY Y-DATA
fig = plt.figure()
ax = fig.add_subplot(111)
ax2 = ax.twiny()
ax2.set_xscale('log', basex=2)
ax2.xaxis.set_major_formatter(ScalarFormatter()) ## REMOVE SCIENTIFIC NOTATION FOR LABELS
ax2.set_xticks(x[::3]) ## MAJOR
ax2.set_xticks([x[idx] for idx in range(len(x)) if idx % 3 != 0], minor=True) ## MINOR
ax2.tick_params(axis='x', colors='gray', labelsize=7)
plt.setp(ax2.get_xminorticklabels(), visible=False) # Grab the ticks and hide them
ax2.set_xlim(min(x)-1, max(x)+1)