如何从 Dataframe 绘制等高线图

qhhrdooz  于 2022-09-21  发布在  其他
关注(0)|答案(1)|浏览(198)

我想使用表数据绘制等高线图。我有2个变量和响应(3列)。我不明白如何用它来建造这个地块。我尝试了下面的代码。但我又犯了一个错误:输入z必须是2D的,而不是1D的。

feature_x = data.factor1
feature_y = data.factor2

# Creating 2-D grid of features

[X, Y] = np.meshgrid(feature_x, feature_y)

fig, ax = plt.subplots(1, 1)

Z = data.response

# plots filled contour plot

ax.contourf(X, Y, Z)

ax.set_title('Filled Contour Plot')
ax.set_xlabel('feature_x')
ax.set_ylabel('feature_y')

plt.show()

数据

u7up0aaq

u7up0aaq1#

要绘制等高线图,z需要是具有点(x,y)的所有值的2D矩阵。您可以将等高线绘制所需的数据视为DataFrame,其中索引为x,列为y,值为z。因此,z需要是形状(x.size, y.size)的二维阵列。

因为您的z不是2D矩阵而是1D阵列,所以您不能有等高线图。

例如,您可以使用hue和/或size来执行relplot

import numpy as np
import pandas as pd
import seaborn as sns

x = np.array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3])
y = np.array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
z = np.array([249, 523, 603, 775, 577, 763, 808, 695, 642, 525, 795, 758])
df = pd.DataFrame({'x':x, 'y':y, 'z':z})

sns.relplot(
    data=df,
    x='x', y='y',
    size='z', sizes=(10, 100),
    hue='z',
    palette='coolwarm',
);

编辑

但是..。如果您正在寻找连续估计,则可以使用gaussian_kde,例如

import scipy.stats as sps
import matplotlib.pyplot as plt

offset = .25
xmin = x.min()-offset
xmax = x.max()+offset
ymin = y.min()-offset
ymax = y.max()+offset

X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([X.ravel(), Y.ravel()])
values = np.vstack([x, y])
kernel = sps.gaussian_kde(values, weights=z)
Z = np.reshape(kernel(positions).T, X.shape)

fig, ax = plt.subplots(figsize=(7, 7))
ax.imshow(np.rot90(Z), cmap=plt.cm.gist_earth_r,
          extent=[xmin, xmax, ymin, ymax],
          aspect='auto'
         )
sns.scatterplot(
    data=df,
    x='x', y='y',
    size='z', sizes=(10, 200),
    color='k'
)
ax.set_xlim([xmin, xmax])
ax.set_ylim([ymin, ymax])
ax.legend(loc='upper left', bbox_to_anchor=(1,1))
plt.show()

相关问题