如果图是对数的,如何删除一个图的第一个和最后一个刻度标签?
经典示例:
import matplotlib.pyplot as plt
import numpy as np
ax1 = plt.subplot(1, 3, 1)
x = np.logspace(-3,1,100)
plt.plot(x,np.random.random(size=100))
plt.xscale('log')
ax2 = plt.subplot(1, 3, 2, sharey = ax1)
plt.plot(x,np.random.random(size=100))
plt.tick_params(axis='y',labelleft='off')
plt.subplots_adjust(wspace=0)
导致x轴上的标签重叠。
现在,如果我通过*_ticklabels
做最简单的事情,例如,
l = [""] + [i.get_text() for i in ax2.get_xticklabels()[1:-1]] + [""]
ax2.set_xticklabels(l)
它不起作用(在脚本中,如果matplotlib首先绘制绘图,则不会。)
我发现的一种方法是使用自定义的自动收报机对象。例如
from matplotlib.ticker import ScalarFormatter
class _MyTickFormatter(ScalarFormatter):
def __init__(self, hide):
self.hide = hide
super(self.__class__, self).__init__()
def __call__(self, x, pos=None):
N = len(self.locs)
hide = [ N + i if i < 0 else i for i in self.hide ]
if pos in hide:
return ''
else:
return self.pprint_val(x)
有了这个,可以做ax2.set_major_formatter(_MyTickFormatter([0,-1]))
。
然而,如果x轴是例如对数(如上所述)。然后解决方案需要另一个自定义tickformatter ...
另一种可能性是使用in this answer by Bernie所述的MaxNLocator
。但是,在对数轴上使用它只留下一个刻度(因为它应该使用LogLocator
,我假设。)
我有什么想法可以解决这个难题?
答案 0 :(得分:3)
尝试以下方法:
xticks = ax.xaxis.get_major_ticks()
xticks[0].label1.set_visible(False)
xticks[-1].label1.set_visible(False)
它应该先删除。
答案 1 :(得分:1)
正如user1834164所评论的那样,“在'日志'轴中,第一个和最后一个勾号默认标记为空,似乎是”。
+ (NSString*)iso6709StringFromCLLocation:(CLLocation*)location
{
//Comes in like
//+39.9410-075.2040+007.371/
//Goes out like
//+39.9410-075.2040/
if (location) {
return [NSString stringWithFormat:@"%+08.4f%+09.4f/",
location.coordinate.latitude,
location.coordinate.longitude];
} else {
return nil;
}
}
因此,只需将索引从0更改为1,从-1更改为-2,armatita的答案就可以了。
答案 2 :(得分:0)
这不会解决你的问题,但无论如何它希望它能帮到你。您可以尝试旋转刻度标签。我发现这在处理长重叠的x标签时非常有用。您可以在设置x-ticks时将rotate=45
设为kwarg,也可以稍后再使用
for tick in ax.get_xticklabels():
tick.set_rotation(45)