PetGriffin
PetGriffin

Reputation: 545

Confused about plotting interpolated 2D data with matplotlib

I have some unstructured 2D data that I would like to interpolate on a unit offset grid (ie grid indices start at 1 not 0) using scipy and plot using matplotlib. The code is below

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

#         X  Y   Z
data = [[ 9, 2, 2.0],
        [ 3, 3, 5.0],
        [ 6, 4, 1.0],
        [ 2, 6, 3.0],
        [10, 7, 4.5],
        [ 5, 8, 2.0]]

data = np.array(data)
coords = data[:, 0:2]
zvals  = data[:, 2]

# Create the grid on which to interpolate (unit offset)

nx = 10
ny = 10
x = np.arange(nx)
x += 1
y = np.arange(ny)
y += 1

grid_x, grid_y = np.meshgrid(x, y, indexing='xy')

# Interpolate

grid_z1 = scipy.interpolate.griddata(coords, zvals, (grid_x, grid_y), method='linear')

# Plot the results

fig, axs = plt.subplots()
plt.imshow(grid_z1)
plt.plot(coords[:,0], coords[:,1], 'k.', ms=10)

plt.show()

The point data seem to be in the right place but matplotlib seems to be plotting the gridded data as zero-offset not unit-offset. I am obviously missing something - just not sure what. Thanks in advance!

Upvotes: 1

Views: 73

Answers (1)

Corralien
Corralien

Reputation: 120391

Update

fig, axs = plt.subplots()
plt.imshow(grid_z1, origin='lower', extent=[1, 10, 1, 10])
plt.plot(coords[:,0], coords[:,1], 'k.', ms=10)

plt.show()

enter image description here


IIUC, you want to define xlim and ylim equal to the plot and not the heatmap:

plt.plot(coords[:,0], coords[:,1], 'k.', ms=10)
ax = plt.gca()
xlim, ylim = ax.get_xlim(), ax.get_ylim()
plt.imshow(grid_z1)
ax.set_xlim(xlim)
ax.set_ylim(ylim)

Output:

enter image description here

Upvotes: 1

Related Questions