2017-09-13 81 views
0

我正在使用Astropy WCS软件包对各种球形投影图进行一系列工作,并遇到了有关网格线的一些挫折感。由于网格线不总是与图像边界框相交或多个相交在相同的地方,因此它们可以不带标签或使标签变得难以辨认。我希望能够在每行中插入网格线标签,这与应用于等高线图的matplotlib.pyplot.clabel()函数非常相似,如在此matplotlib example中所示。我无法嵌入图像,因为我是新用户;我很抱歉。我知道我可以使用text(),figtext()或annotate()来放置标签,但由于clabel()工作,我认为功能已经存在,即使它没有被应用到网格线。将投影绘制在一边,没有人知道类似于clabel()的内联网格线标签可以应用于普通矩形图上的网格线吗?Matplotlib:投影绘制类似于clabel的网格线上的标签()

+0

'clabel(CS,** kwargs)' 添加标签到轮廓线在'cs',其中'cs'是由'contour'返回的ContourSet对象。因此,您有两种选择:**(a)**使用等高线图绘制网格线,然后使用clabel标注线**(b)**使用普通网格线并编写自定义函数来标记线。你需要哪一个帮助? – ImportanceOfBeingErnest

+0

顺便说一下,新用户可以发布图片,那些将显示为链接而不是内联。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest我不能包含两个以上的链接,或者我会包含一些图片。我没有想过选项**(a)**;我喜欢这个想法,但是觉得这样做很难实现,以便在没有无数次调整的情况下为许多不同的地块工作。所以我想和**(b)**一起去;我希望找到一些聪明的方式来从clabel()复制功能,而不是从头开始编写自定义网格线标记功能。 –

回答

0

要注释网格线,您可以使用主要刻度线的位置(因为这些位置是网格线的创建位置)。

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0,10) 
y = np.sin(x)*10 

fig, ax = plt.subplots() 
ax.plot(x,y) 
ax.grid() 

for xi in ax.xaxis.get_majorticklocs(): 
    ax.text(xi,0.8, "{:.2f}".format(xi), clip_on=True, ha="center", 
      transform=ax.get_xaxis_transform(), rotation=90, 
      bbox={'facecolor':'w', 'pad':1, "edgecolor":"None"}) 
for yi in ax.yaxis.get_majorticklocs(): 
    ax.text(0.86,yi, "{:.2f}".format(yi), clip_on=True, va="center", 
      transform=ax.get_yaxis_transform(), 
      bbox={'facecolor':'w', 'pad':1, "edgecolor":"None"}) 

plt.show() 

enter image description here

+0

谢谢,这有助于显着!这并不是最理想的,因为必须对每个小区进行硬编码(以避免尽可能多地覆盖数据等),但这是朝正确方向迈出的一步。我觉得像一堆代码可以从clabel()中拉出来并应用到网格线而不是轮廓线,但是我不熟悉matplotlib知道如何做到这一点。 –

+0

你总是可以使事情比他们需要的更复杂。 ['ContourLabeler'代码](https://github.com/matplotlib/matplotlib/blob/e66b5d86743e11323d2bbc1b6eb2117d2ef535a3/lib/matplotlib/contour.py#L57)长度为500行,旨在与'ContourSet'一起使用。为了使用它,网格线也需要是一个'ContourSet'。但与上述答案中的4行长代码相比,基本没有任何收益。 – ImportanceOfBeingErnest