在MatPlotLib中,我想绘制一个具有线性x轴和对数y轴的图形。对于x轴,应该有4的倍数的标签,以及1的倍数的次要刻度。我已经能够使用MultipleLocator
类来执行此操作。
但是,对于对数y轴,我很难做类似的事情。我希望有0.1,0.2,0.3等标签,0.11,0.12,0.13等小标记。我试过用LogLocator
类做这个,但我不确定什么是正确的参数是
这是我尝试过的:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
y = [0.32, 0.30, 0.28, 0.26, 0.24, 0.22, 0.20, 0.18, 0.16, 0.14, 0.12, 0.10]
fig = plt.figure()
ax1 = fig.add_subplot(111)
x_major = MultipleLocator(4)
x_minor = MultipleLocator(1)
ax1.xaxis.set_major_locator(x_major)
ax1.xaxis.set_minor_locator(x_minor)
ax1.set_yscale("log")
y_major = LogLocator(base=10)
y_minor = LogLocator(base=10)
ax1.yaxis.set_major_locator(y_major)
ax1.yaxis.set_minor_locator(y_minor)
ax1.plot(x, y)
plt.show()
这显示了以下情节:
x轴是我想要的,但不是y轴。 y轴上有一个标签,为0.1,但没有0.2和0.3的标签。此外,在0.11,0.12,0.13等处没有蜱虫。
我为LogLocator
构造函数尝试了一些不同的值,例如subs
,numdecs
和numticks
,但我无法获得正确的图表。 https://matplotlib.org/api/ticker_api.html#matplotlib.ticker.LogLocator的文档并没有真正解释这些参数。
我应该使用哪些参数值?
答案 0 :(得分:0)
我认为你仍然需要MultipleLocator
而不是LogLocator
,因为你想要的刻度线位置仍然是" 在视图间隔中基数倍数的每个整数上"而不是" subs [j] * base ** i "。例如:
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
y = [0.32, 0.30, 0.28, 0.26, 0.24, 0.22, 0.20, 0.18, 0.16, 0.14, 0.12, 0.10]
fig = plt.figure(figsize=(8, 12))
ax1 = fig.add_subplot(111)
x_major = MultipleLocator(4)
x_minor = MultipleLocator(1)
ax1.xaxis.set_major_locator(x_major)
ax1.xaxis.set_minor_locator(x_minor)
ax1.set_yscale("log")
# You would need to erase default major ticklabels
ax1.set_yticklabels(['']*len(ax1.get_yticklabels()))
y_major = MultipleLocator(0.1)
y_minor = MultipleLocator(0.01)
ax1.yaxis.set_major_locator(y_major)
ax1.yaxis.set_minor_locator(y_minor)
ax1.plot(x, y)
plt.show()
LogLocator
总是将主刻度标签放在" 每个基地** i "。因此,不可能将它用于您想要的主要刻度标签。您可以将参数subs
用于您的次要刻度标签,如下所示:
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, LogLocator
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
y = [0.32, 0.30, 0.28, 0.26, 0.24, 0.22, 0.20, 0.18, 0.16, 0.14, 0.12, 0.10]
fig = plt.figure()
ax1 = fig.add_subplot(111)
x_major = MultipleLocator(4)
x_minor = MultipleLocator(1)
ax1.xaxis.set_major_locator(x_major)
ax1.xaxis.set_minor_locator(x_minor)
ax1.set_yscale("log")
y_major = LogLocator(base=10)
y_minor = LogLocator(base=10, subs=[1.1, 1.2, 1.3])
ax1.yaxis.set_major_locator(y_major)
ax1.yaxis.set_minor_locator(y_minor)
ax1.plot(x, y)
plt.show()