【问题标题】:Change axis range into latitude and longitude using matplotlib in python在 python 中使用 matplotlib 将轴范围更改为纬度和经度
【发布时间】:2014-07-06 17:53:09
【问题描述】:

如何使用我想要的并且与图中的数据不相关的 yaxis 和 xaxis? 例如,我想使用以下代码将世界地图绘制为图像:

import matplotlib.pyplot as plt

fig = plt.figure()
plt.imshow(world_map)

结果,我得到了从左到右的 xaxis: 0...image_size_x 和从上到下的 yaxis: 0...image_size_y。 我需要做什么才能将其轴范围更改为纬度和经度格式?因此,图形轴应该在两个字段(x 和 y)上包含度数(从 90 到 -90),而不管它在图中绘制的实际数据是什么。 设置

pylab.ylim([90,-90]) 

将图像向底部移动 90 像素,并将图像的 y 维度缩小为 image_size_y/90 的比例。所以它不起作用,因为 xlim/ylim 使用数据,绘制在图中。

【问题讨论】:

    标签: python matplotlib axis latitude-longitude


    【解决方案1】:

    假设(根据您的帖子)图像很好,但轴标签已关闭,请尝试使用它,这将手动实现轴标签:

    plt.figure(1)     
    ax = plt.subplot(111)
    #... do your stuff
    #need to figure out your image size divided by the number of labels you want
    #FOR EXample, if image size was 180, and you wanted every second coordinate labeled:
    ax.set_xticks([i for i in range(0,180,2)]) #python3 code to create 90 tick marks
    ax.set_xticklabels([-i for i in range(-90,90,2)]) #python3 code to create 90 labels
    #DO SAME FOR Y
    

    我使用的技巧是计算出你想要多少个标签(这里是 90:180/2),在 (0,imagesize) 范围内均匀添加刻度线,然后手动做标签。这是一个通用公式:

    ax.set_xticks([i for i in range(0,IMAGE_SIZE,_EVERY_XTH_COORD_LABELED)]) #python3 code to create 90 tick marks
    ax.set_xticklabels([-i for i in range(-90,90,EVERY_XTH_COORD_LABELED)]) #python3 code to create 90 labels
    

    【讨论】:

    • set_xticklabels 几乎总是一个坏主意。它将您的标签与数据分离。最好使用FuncFormatter
    【解决方案2】:

    简而言之:将extent 关键字与imshow 一起使用。

    在代码中:

    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax = fig.add_subaxis(111)
    ax.imshow(world_map, extent=[-180,180,-90,90], aspect='auto')
    

    如果您的地图是上下颠倒的,请将关键字参数origin='lower' 添加到imshow。需要aspect='auto' 才能使地图在两个维度上独立扩展。 (其余带有add_subaxis 的额外行只是为了使代码更加面向对象,真正的牛在关键字参数中。)

    如果imshow 没有给出图像的范围,它认为您希望每个像素都以 (0,0), (0,1), ..., (Nx-1) 位置为中心, Ny-1),然后图像范围将从 (-.5, -.5) 开始。

    【讨论】:

    • 效果很好。但问题是我使用mercator projection map,其中每个 20 度的纬度(y 维度)都有不同的像素大小。所以我认为更好的方法是使用 Tommy 下面所说的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多