如何在python中对齐地图和y图的y轴(纬度)

问题描述 投票:1回答:1

我正在尝试在情节中绘制两个面板。第一个(左)是在y轴上具有纬度值的数据。第二个面板是地图。我想要两个面板的纬度值重合,但我不知道如何得到它。

我有这样的代码:

fig_mapa= plt.figure()

'''Mapa'''
ax1=fig_mapa.add_subplot(122)
map = Basemap(llcrnrlon=-90,llcrnrlat=-58.1,urcrnrlon=-32,urcrnrlat=12.6,
            resolution='f',projection='merc',lon_0=-58,lat_0=-25, ax=ax1)
map.drawparallels(np.arange(-90,90.,5), labels=[0,1,0,0], linewidth=0.5)
map.drawmeridians(np.arange(-180.,180.,5), labels=[0,0,0,1], linewidth=0.5)
map.readshapefile("./Fases_tectonicas/Shapefiles/Unidades_Fi",  'Unidades_Fi', linewidth=0.1)
#map.warpimage(image='./Geotiffs/NE1_HR_LC_SR_W_DR/NE1_HR_LC_SR_W_DR.tif', zorder=1)
map.drawcoastlines(linewidth=0.5, color='k')
Nombre_Unidad= []
for elemento in map.Unidades_Fi_info:
    Nombre_Unidad.append(elemento['NAME'])
for i in range(len(Nombre_Unidad)):
    draw=map.Unidades_Fi[i]
    poly=Polygon(draw, facecolor=color[Nombre_Unidad[i]],edgecolor='k', alpha=0.5,linewidth=0.1, zorder=2)
    plt.gca().add_patch(poly)

'''Gráfico Eventos Compresivos'''
ax2= fig_mapa.add_subplot(121)
ax2.set_ylim(-58.1,12.6)
ax2.set_xlim(120,0)
ax2.set_xlabel('Tiempo [Ma]')
ax2.set_ylabel('Latitud[°]')
ax2.grid()
matplotlib-basemap yaxis
1个回答
0
投票

对齐两个轴的最简单方法是使用sharexsharey关键字进行plt.subplots。但是,Basemap显示的坐标和它用于Axes实例的坐标是两个不同的东西,所以如果你想在第二个Axes实例中有可理解的ytick标签和一些有意义的图形,你必须在两者之间进行转换。下面我将展示如何对齐两个y轴,正确设置yticks并将数据转换为Basemap的数据坐标。我没有触及底图的创建。

from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np

##figure with two subplots and shared y-axis
fig,(ax2,ax1) = plt.subplots(nrows=1, ncols=2, sharey='row')

m1 = Basemap(llcrnrlon=-90,llcrnrlat=-58.1,urcrnrlon=-32,urcrnrlat=12.6,
            #resolution='f',
              projection='merc',lon_0=-58,lat_0=-25, ax=ax1)
m1.drawparallels(np.arange(-90,90.,5), labels=[0,1,0,0], linewidth=0.5)
m1.drawmeridians(np.arange(-180.,180.,5), labels=[0,0,0,1], linewidth=0.5)
m1.drawcoastlines(linewidth=0.5, color='k')

##turning off yticks at basemap
ax1.yaxis.set_ticks_position('none')

##setting yticks:
yticks = np.arange(-55,12.6,5)
##transform yticks:
_,yticks_data = m1(0*yticks,yticks)
ax2.set_yticks(yticks_data)
ax2.set_yticklabels(['{: >3}$^\circ${}'.format(
    abs(int(y)), 'N' if y>0 else 'S' if y<0 else ' '
) for y in yticks])

ax2.set_xlim(120,0)
ax2.set_xlabel('Tiempo [Ma]')
ax2.set_ylabel('Latitud[$^\circ$]')
ax2.grid()

#some fake data for testing plotting
yrange = np.linspace(-60,20,100)
temp = (np.sin(10*np.deg2rad(yrange))+1)*50
##transform yrange
_,yrange_data = m1(0*yrange, yrange)
ax2.plot(temp,yrange_data)

plt.show()

上面代码的结果如下所示:

result of the above code

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.