Matplotlib: pcolormesh или pcolor из трех столбцов панд данных - PullRequest
0 голосов
/ 31 августа 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 0 
1.43598 0.874721 0 
1.48996 0.874721 4.27933 

и т.д.

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

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

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

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

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv('mydata.tmp', delim_whitespace=True, 
                     comment='#',header=None,
                     names=['a','b','c'])

fig, ax = plt.subplots()

sc = ax.scatter(df.a, df.b, c=df.c,  cmap="GnBu", s=400, 
     norm=matplotlib.colors.LogNorm())

fig.colorbar(sc, ax=ax)

plt.show()

и я получаю картинку, которую я показываю ниже (игнорируйте масштаб оси x). Однако я хочу получить результат, которого я добиваюсь, когда я делаю это с GNUplot с этим кодом (я также прилагаю образ GNUplot)

plot mydata.tmp using 1:2:3 with image

Может быть, я должен использовать pcolormesh? Спасибо!

Изображение GNUplot: GNUplot Image

Matplotlib Image: Matplotlib Image

Когда я пробую код Халила, я получаю следующее изображение: enter image description here

1 Ответ

0 голосов
/ 31 августа 2018

Попробуйте это. Проверено и работаю над некоторыми данными, которые у меня есть. Интервал очень важен. установить его в соответствии с сеткой вы хотите для сюжета. Чем больше интервал, тем более плавное изображение, но чем дольше вычисление.

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']

# Set up a regular grid of interpolation points

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

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

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

ZI = rbf(XI, YI)

#plot

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...