【发布时间】:2017-09-22 17:33:44
【问题描述】:
我正在努力获得更好看的对数图,除了一个小问题,我几乎得到了我想要的。
我的示例偏离标准设置的原因是 x 值限制在不到十年内,我想使用十进制,而不是科学记数法。
请允许我用一个例子来说明:
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib as mpl
import numpy as np
x = np.array([0.6,0.83,1.1,1.8,2])
y = np.array([1e-5,1e-4,1e-3,1e-2,0.1])
fig1,ax = plt.subplots()
ax.plot(x,y)
ax.set_xscale('log')
ax.set_yscale('log')
产生:
x轴有两个问题:
科学记数法的使用,在这种情况下会适得其反
右下角可怕的“偏移”
读了很多,我加了三行代码:
ax.xaxis.set_major_formatter(mpl.ticker.ScalarFormatter())
ax.xaxis.set_minor_formatter(mpl.ticker.ScalarFormatter())
ax.ticklabel_format(style='plain',axis='x',useOffset=False)
这会产生:
我对此的理解是有 5 个小刻度和 1 个大刻度。它好多了,但仍然不完美:
- 我想要一些介于 1 和 2 之间的额外刻度
- 1 处的标签格式错误。它应该是“1.0”
所以我在格式化语句之前插入了以下行:
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(0.2))
我终于得到了我想要的滴答声:
我现在有 8 个主要刻度和 2 个次要刻度。现在,这看起来几乎是正确的,只是 0.6、0.8 和 2.0 处的刻度标签看起来比其他的更粗。这是什么原因,我该如何纠正?
【问题讨论】:
-
这可能是一个渲染工件。对我来说,如果我以更高分辨率 (
fig.savefig("test.png",dpi=300)) 保存图形,它就会消失。如果我删除set_minor_formatter行,它也会消失,但是你会在 0.7 和 0.9 处丢失次要刻度。 -
0.6 和 0.8 更粗,因为它们被写为次要刻度标签和主要刻度标签;当它渲染它们时,它们必须彼此稍微偏移,因此它们看起来更粗。
-
@tom 它们没有偏移,这是由于两个完全重叠的文本的抗锯齿。
-
@ImportanceOfBeingErnest:很好,我从来没有意识到这就是原因。那么当文本被抗锯齿时,部分填充的像素是半透明的吗?因此,当您有两个重叠的文本时,那些半透明的像素会变暗吗?
-
@tom 虽然抗锯齿可能不适用于透明度本身,但这是人们最能想象发生的事情的方式。另一方面,如果您将两个不同颜色的文本(甚至线条)放在彼此的顶部,您会看到一些其他效果,因此用于抗锯齿的不仅仅是颜色混合。现在可能这有点离题了。
标签: matplotlib