我想创建10的幂的数组作为图的y轴的标签。
我正在使用plt.yticks()
,并将matplotlib导入为plt,但是无论如何这都没关系。
我有一些图,其中y轴从1e3到1e15变化。这些是对数图。
Matplotlib自动以1e2步长显示带有刻度线的那些,而我想改为以10为步长(以便能够正确使用次要标记)。
我想使用plt.yticks(numpy.arange(1e3, 1e15, 10))
命令,但是numpy.arange(1e3, 1e15, 10)
导致MemoryError。它不是应该输出长度为13的数组吗?为什么内存已满?
如何克服此问题而不手动构建阵列?
我还尝试使用内置的range
,但不适用于浮点数。
谢谢。
答案 0 :(得分:6)
尝试以{p>中的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])
答案 1 :(得分:1)
您也可以这样做:
10. ** np.arange(3,16)
小数点很重要,因为没有小数点,您将溢出默认的int32
dtype(整数)
答案 2 :(得分:1)
执行此操作的另一种方法(而不是显式定义刻度位置)是使用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())
答案 3 :(得分:0)
在这种情况下,numpy中的函数extension UIToolbar {
func hideBottomHairline() {
self.hairlineImageView?.isHidden = true
}
func showBottomHairline() {
self.hairlineImageView?.isHidden = false
}
}
更合适。
该示例的答案是
logspace