Contour / Scatter Plot - интерполированные данные, не покрывающие весь график рассеяния - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь создать карту, показывающую интерполированные значения по точечной диаграмме, здесь мой код пока


# define map extent
lllon = dd
lllat = bb
urlon = cc
urlat = aa

# Set up Basemap instance
m = Basemap(
    projection = 'merc',
    llcrnrlon = lllon, llcrnrlat = lllat, urcrnrlon = urlon, urcrnrlat = urlat,
    resolution='h')

# transform lon / lat coordinates to map projection
newdf['LONGITUDE'], newdf['LATITUDE'] = m(*(newdf['LONGITUDE'].values, newdf['LATITUDE'].values))

# grid data
#numcols, numrows = count_col, count_row
#xi = np.linspace(dd, cc, numcols)
#yi = np.linspace(bb, aa, numrows)
#xi, yi = np.meshgrid(xi, yi)

count_row = newdf.shape[0]  # gives number of row count
count_col = newdf.shape[1]  # gives number of col count

xi = np.linspace(newdf['LONGITUDE'].min(), newdf['LONGITUDE'].max(), count_col)
yi = np.linspace(newdf['LATITUDE'].min(), newdf['LATITUDE'].max(), count_row)
xi, yi = np.meshgrid(xi, yi)

x, y, z = newdf['LONGITUDE'].values, newdf['LATITUDE'].values, newdf['MUD_WGHT'].values
#zi = griddata(x, y, z, xi, yi)
zi = griddata((x,y),z,(xi,yi),method='linear')

# interpolate
#x, y, z = newdf['LONGITUDE'].values, newdf['LATITUDE'].values, newdf['MUD_WGHT'].values
#zi = griddata((x,y),z,(xi,yi),method='linear')

# draw map details
m.drawmapboundary(fill_color = 'white')
m.fillcontinents(color='#C0C0C0', lake_color='#7093DB')
m.drawcountries(
    linewidth=.75, linestyle='solid', color='#000073',
    antialiased=True,
    ax=ax, zorder=3)

m.drawparallels(
    np.arange(lllat, urlat, 2.),
    color = 'black', linewidth = 0.5,
    labels=[True, False, False, False])
m.drawmeridians(
    np.arange(lllon, urlon, 2.),
    color = '0.25', linewidth = 0.5,
    labels=[False, False, False, True])

# contour plot
con = m.contourf(xi, yi, zi, zorder=4, alpha=0.6, cmap='RdPu')
# scatter plot
m.scatter(
    newdf['LONGITUDE'],
    newdf['LATITUDE'],
    color='#545454',
    edgecolor='#ffffff',
    alpha=.75,
    s=50 * norm(newdf['MUD_WGHT'].values),
    cmap='RdPu',
    ax=ax,
    vmin=zi.min(), vmax=zi.max(), zorder=4)

# add colour bar and title
# add colour bar, title, and scale
cbar = plt.colorbar(orientation='horizontal', fraction=.057, pad=0.05)
cbar.set_label("Mud Weight - PPG")

#m.drawmapscale(
 #   24., -9., 28., -13,
  #  100,
   # units='km', fontsize=10,
    #yoffset=None,
    #barstyle='fancy', labelstyle='simple',
    #fillcolor1='w', fillcolor2='#000000',
    #fontcolor='#000000',
    #zorder=5)

plt.title("Regional Mud Weights in The Lateral")

plt.show()

Результат следующий:

image

Как мне получить область интерполированного контура, чтобы она распространялась на график полного рассеяния? Я сосредоточился на том, связана ли эта проблема с сеткой сетки, поэтому я не уверен, что сетка сетки не интерполирует все данные или это проблема с построением графика.

1 Ответ

0 голосов
/ 05 марта 2020

Вам нужно сделать triangulation и использовать tricontour и / или tricontourf. Вот демонстрационный код и пример графика.

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

# data coordinates must conform to the projection
x = np.random.random((30))
y = np.random.random((30))
z = x * y
yn = 30*x
xn = 80 + 30*y

tri = Triangulation(xn,yn)  #create tri mesh

fig = plt.figure(figsize=(7, 7))
m = Basemap(projection = 'cyl',
           llcrnrlat = 0,
           urcrnrlat = 30,
           llcrnrlon = 80,
           urcrnrlon = 110,
           resolution = 'l')

ctf = plt.tricontourf(tri, z, cmap=cm.coolwarm, zorder=10, alpha=0.75)
#plt.tricontour(tri, z, )
plt.scatter(xn, yn, c='g', zorder=13)

m.drawparallels(np.arange(-90, 90,10), labels=[1,0,0,0])
m.drawmeridians(np.arange(-180, 180, 10), labels = [0,0,0,1])
m.drawcoastlines(linewidth=0.8, color='blue', zorder=12)
m.fillcontinents(color='#C0C0C0', lake_color='#7093DB')

cbar = plt.colorbar(ctf , orientation='horizontal', fraction=.045, pad=0.08)
plt.show()

enter image description here

...