Matplotlib интерполировать пустые пиксели - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть файл 'mydata.tmp', который содержит 3 столбца, например:

3.81107 0.624698 0.000331622 
3.86505 0.624698 0.000131237 
3.91903 0.624698 5.15136e-05 
3.97301 0.624698 1.93627e-05 
1.32802 0.874721 1.59245 
1.382   0.874721 1.542
1.43598 0.874721 1.572 
1.48996 0.874721 4.27933 

и т.д.

Затем я хочу построить цветную диаграмму, в которой первые два столбца являются координатами, а третий столбец - значениями этих координат.

Кроме того, я хотел бы установить третий столбец в масштабе журнала.

Я сделал это

import pandas as pd
import matplotlib.pyplot as plt
import scipy.interpolate
import numpy as np
import matplotlib.colors as colors

# import data
df = pd.read_csv('mydata.tmp', delim_whitespace=True, 
                 comment='#',header=None,
                 names=['1','2','3'])

x = df['1']
y = df['2']
z = df['3']

spacing = 500
xi, yi = np.linspace(x.min(), x.max(), spacing), np.linspace(y.min(), 
                 y.max(), spacing)

XI, YI = np.meshgrid(xi, yi)

rbf = scipy.interpolate.Rbf(x, y, z, function='linear')

ZI = rbf(XI, YI)

fig, ax = plt.subplots()

sc = ax.imshow(ZI, vmin=z.min(), vmax=z.max(), origin='lower',
        extent=[x.min(), x.max(), y.min(), 
                y.max()], cmap="GnBu", norm=colors.LogNorm(vmin=ZI.min(),
                vmax=ZI.max()))

fig.colorbar(sc, ax=ax, fraction=0.05, pad=0.01)

plt.show()

И я получаю это изображение enter image description here

, который имеет все эти пустые пиксели.

Вместо этого я ищу что-то подобное (я сделал эту другую картинку с GNUplot): enter image description here

Как я могу это сделать?

1 Ответ

0 голосов
/ 01 сентября 2018

Вы можете использовать cmap.set_bad, чтобы определить цвет для значений NaN:

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

import matplotlib.colors as colors
from matplotlib import cm
import copy

# Some data
x = np.array([0, 1, 3, 0, 2, 4])
y = np.array([0, 0, 0, 1, 1, 1])
z = np.array([2, 2, 3, 2, 3, 4])

# Interpolation on a grid:
nrb_points = 101
xi = np.linspace(-.5, 4.5, nrb_points)
yi = np.linspace(-.5, 1.5, nrb_points)

XI, YI = np.meshgrid(xi, yi)
xy = np.vstack((x, y)).T
XY = (XI.ravel(), YI.ravel())

ZI = griddata(points, z, XY,
              method='linear',
              fill_value=np.nan) # Value used [for] points
                                 # outside of the convex hull
                                 # of the input points.
ZI = ZI.reshape(XI.shape)

# Color map:
cmap = copy.copy(cm.jet)
cmap.set_bad('grey', 1.)

# Graph:
plt.pcolormesh(xi, yi, ZI,
               #norm=colors.LogNorm(),
               cmap=cmap);
plt.colorbar(label='z');
plt.plot(x, y, 'ko');
plt.xlabel('x'); plt.ylabel('y');

результат:

example_with_set_bad

Я бы также использовал griddata вместо метода RBF для интерполяции. Затем, точка вне области входных данных (то есть выпуклая оболочка) может быть установлена ​​в NaN.

...