Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用matplotlib basemap打印球体栅格_Matplotlib_Map Projections_Matplotlib Basemap - Fatal编程技术网

使用matplotlib basemap打印球体栅格

使用matplotlib basemap打印球体栅格,matplotlib,map-projections,matplotlib-basemap,Matplotlib,Map Projections,Matplotlib Basemap,我想画一个网格,覆盖正交投影上的所有球体。 问题是投影之外的单元格未正确绘制。如前所述,drawgreatcircles出现了这种情况 我也尝试过使用描述中的多边形,但同样的问题 最后,我编写了一个基于的自定义检查代码。我们的想法是,对于每个段的每个点,我们检查cos c(参见维基百科),如果cosinus为负值,则不绘制它 我的问题是:我们可以用basemap自己的函数进行这种检查吗? 这一战略不适用于其他预测 另外,为什么这种检查不包括在底图中?这里有一个使用pcolor的解决方案: imp

我想画一个网格,覆盖正交投影上的所有球体。 问题是投影之外的单元格未正确绘制。如前所述,
drawgreatcircles
出现了这种情况

我也尝试过使用描述中的多边形,但同样的问题

最后,我编写了一个基于的自定义检查代码。我们的想法是,对于每个段的每个点,我们检查cos c(参见维基百科),如果cosinus为负值,则不绘制它

我的问题是:我们可以用basemap自己的函数进行这种检查吗? 这一战略不适用于其他预测


另外,为什么这种检查不包括在底图中?

这里有一个使用pcolor的解决方案:

import pylab as plt
from mpl_toolkits.basemap import Basemap
import numpy as np

nb_lat2 = 20
nb_lat = 2*nb_lat2
nb_lon = 3*(2*(nb_lat+1) - 1)
lats = np.zeros((2*nb_lat, nb_lon))
lons = np.zeros((2*nb_lat, nb_lon))
val = np.zeros((2*nb_lat, nb_lon))
dlat = 90./nb_lat2
for i in range(nb_lat):

  nb_lon = 2*(i+1)-1
  if ((i+1) > nb_lat2):
    nb_lon = 2*(nb_lat - i)-1

  dlon = 120./nb_lon
  lats[2*i][:] = 90 - i*dlat
  lats[2*i+1][:] = 90 - (i+1)*dlat
  for j in range(nb_lon):
    lons[2*i][j] = j*dlon
    lons[2*i+1][j] = j*dlon

    for k in range(1,3):
      lons[2*i][j + k*nb_lon] = j*dlon + 120.*k
      lons[2*i+1][j + k*nb_lon] = j*dlon + 120.*k

    lons[2*i][3*nb_lon:] = nb_lon*dlon + 240.
    lons[2*i+1][3*nb_lon:] = nb_lon*dlon + 240.

lons = lons - 180
val = lats + lons
# Crash
##m = Basemap(projection='robin',lon_0=0,resolution=None)

#m = Basemap(projection='mill',lon_0=0)
m = Basemap(projection='ortho', lat_0=0,lon_0=0)
x, y = m(lons, lats)
m.pcolor(x,y,val, edgecolors='k', linewidths=1)

m.drawcoastlines()
m.drawparallels(np.arange(-90.,91.,30.))
m.drawmeridians(np.arange(-180.,181.,60.))

plt.show()
这正是我想要的:绘制矩形并用一种颜色填充它们。 但是它非常慢(太慢)。许多单元格未使用:在latidude行的末尾,我们将未使用单元格的宽度设置为0


另一个问题是一些投影崩溃(例如Robin)。

这里有一个使用pcolor的解决方案:

import pylab as plt
from mpl_toolkits.basemap import Basemap
import numpy as np

nb_lat2 = 20
nb_lat = 2*nb_lat2
nb_lon = 3*(2*(nb_lat+1) - 1)
lats = np.zeros((2*nb_lat, nb_lon))
lons = np.zeros((2*nb_lat, nb_lon))
val = np.zeros((2*nb_lat, nb_lon))
dlat = 90./nb_lat2
for i in range(nb_lat):

  nb_lon = 2*(i+1)-1
  if ((i+1) > nb_lat2):
    nb_lon = 2*(nb_lat - i)-1

  dlon = 120./nb_lon
  lats[2*i][:] = 90 - i*dlat
  lats[2*i+1][:] = 90 - (i+1)*dlat
  for j in range(nb_lon):
    lons[2*i][j] = j*dlon
    lons[2*i+1][j] = j*dlon

    for k in range(1,3):
      lons[2*i][j + k*nb_lon] = j*dlon + 120.*k
      lons[2*i+1][j + k*nb_lon] = j*dlon + 120.*k

    lons[2*i][3*nb_lon:] = nb_lon*dlon + 240.
    lons[2*i+1][3*nb_lon:] = nb_lon*dlon + 240.

lons = lons - 180
val = lats + lons
# Crash
##m = Basemap(projection='robin',lon_0=0,resolution=None)

#m = Basemap(projection='mill',lon_0=0)
m = Basemap(projection='ortho', lat_0=0,lon_0=0)
x, y = m(lons, lats)
m.pcolor(x,y,val, edgecolors='k', linewidths=1)

m.drawcoastlines()
m.drawparallels(np.arange(-90.,91.,30.))
m.drawmeridians(np.arange(-180.,181.,60.))

plt.show()
这正是我想要的:绘制矩形并用一种颜色填充它们。 但是它非常慢(太慢)。许多单元格未使用:在latidude行的末尾,我们将未使用单元格的宽度设置为0


另一个问题是一些预测崩溃(例如Robin)。

多亏了你的例子,我用cartopy绘制了数据。创建绘图需要进行以下更改:

import cartopy.crs as ccrs
ax =plt.axes(projection=ccrs.Orthographic())
plt.pcolormesh(lons, lats,val, edgecolors='k', 
               linewidths=1, transform=ccrs.PlateCarree())

ax.coastlines()
ax.gridlines()

plt.show()


这是使用pcolormesh,因此速度非常快(尽管您的示例在我的机器上一开始并不慢)。

多亏了您的示例,我获取了数据并用cartopy绘制。创建绘图需要进行以下更改:

import cartopy.crs as ccrs
ax =plt.axes(projection=ccrs.Orthographic())
plt.pcolormesh(lons, lats,val, edgecolors='k', 
               linewidths=1, transform=ccrs.PlateCarree())

ax.coastlines()
ax.gridlines()

plt.show()


这是在使用pcolormesh,因此速度非常快(尽管您的示例在我的机器上一开始并没有那么慢)。

什么样的网格?它只是一个简单的规则全球网格吗?我确信我们可以做一些工作来让Basemap来绘制这个图,你可以考虑看看Cabtoy(迄今为止,未宣布),它可能只是“工作”。不幸的是,网格是不规则的,但是所有的细胞都是矩形的(在Lon Lon坐标中)。不过,我可以很容易地计算出每个单元格的中心和宽度/高度。我会检查cartopy的,谢谢。什么样的网格?它只是一个简单的规则全球网格吗?我确信我们可以做一些工作来让Basemap来绘制这个图,你可以考虑看看Cabtoy(迄今为止,未宣布),它可能只是“工作”。不幸的是,网格是不规则的,但是所有的细胞都是矩形的(在Lon Lon坐标中)。不过,我可以很容易地计算出每个单元格的中心和宽度/高度。我会查cartopy的,谢谢。