我想创建一个10的幂数组作为图的y轴的标签。我正在使用plt.yticks()
和matplotlib作为plt导入,但无论如何这在此无关紧要。我有一些情节,因为y轴从1e3变化到1e15。那些是原木图。 Matplotlib会自动显示带有1e2步的刻度线的那些,我希望步骤为10(为了能够正确使用minorticks)。
我想使用plt.yticks(numpy.arange(1e3, 1e15, 10))
命令,但numpy.arange(1e3, 1e15, 10)
导致MemoryError。是不是应该输出长度为13的数组?为什么内存会变满?
如何跨越此问题而不是手动构建阵列?
我也尝试使用内置的range
但它不适用于浮点数。
谢谢。
试试logspace
的NumPy
plt.yticks(numpy.logspace(3, 15, 13))
在这里,您给出起始和最后一个指数(10的幂)和它们之间的数据点数。如果您打印上面的网格,您将得到以下内容
array([1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07, 1.e+08, 1.e+09, 1.e+10,
1.e+11, 1.e+12, 1.e+13, 1.e+14, 1.e+15])
你也可以这样做:
10. ** np.arange(3,16)
小数点很重要,因为没有它你会溢出整数的默认int32
dtype
另一种方法是使用LogLocator
模块中的matplotlib.ticker
而不是明确定义刻度位置,并手动增加刻度数(默认情况下,它会尝试设置好看的刻度数;即所以它看起来不太局促)。
在这个例子中,我在右边的Axes
上设置了刻度数为13(使用numticks=13
),你可以看到这增加了刻度数,所以每个整数次幂为10时有一个。
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
# Create figure and axes
fig, (ax1, ax2) = plt.subplots(ncols=2)
# Make yscale logarithmic
ax1.set_yscale('log')
ax2.set_yscale('log')
# Set y limits
ax1.set_ylim(1e3, 1e15)
ax2.set_ylim(1e3, 1e15)
# On ax2, lets tell the locator how many ticks we want
ax2.yaxis.set_major_locator(ticker.LogLocator(numticks=13))
ax1.set_title('default ticks')
ax2.set_title('LogLocator with numticks=13')
plt.show()
编辑:
要使用此方法添加次要刻度,我们可以使用另一个LogLocator
,这次设置subs
选项以说明每个十年我们想要的小刻度。在这里,我没有设置每0.1的小刻度,因为它太狭窄,所以只为一个子集完成。请注意,如果您设置此类次要刻度,则还需要使用NullFormatter
关闭次刻度的刻度标签。
ax2.yaxis.set_major_locator(ticker.LogLocator(numticks=13))
ax2.yaxis.set_minor_locator(ticker.LogLocator(subs=(0.2,0.4,0.6,0.8),numticks=13))
ax2.yaxis.set_minor_formatter(ticker.NullFormatter())
在这种情况下,来自numpy的函数logspace
更合适。这个例子的答案是np.logspace(3,15,num=15-3+1, endpoint=True)