Как сделать поверхностный график из DataFrame? - PullRequest
1 голос
/ 22 апреля 2020

У меня есть хороший DataFrame df, где мои X - это строки, мои Y - это столбцы, а мои Z соответствуют df.loc[x, y]: enter image description here

Я просто хочу сделать поверхностный сюжет этого. Пока у меня есть:

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

x = df.index
y = df.columns
X,Y = np.meshgrid(x, y)

zs = np.array(df)
Z = zs.reshape(X.shape)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X,Y,Z)

ax.set_xlabel(df.index.name)
ax.set_ylabel(df.columns.name)
ax.set_zlabel('Approximation')
plt.show()

Но мой результат выглядит нестабильным и несвязным:

enter image description here

Я думаю, что проблема заключается в том, как Я делаю сюжет, а не данные. Я что-то здесь не так делаю? Мне кажется, что изменение массива портит отношения между x, y и z, но я попробовал все параметры упорядочения np.reshape.

1 Ответ

1 голос
/ 22 апреля 2020

I wi sh Я мог бы дать более интересный ответ, но, вероятно, просто в ваших данных есть шум, который отражается на графике вашей поверхности.

Я воссоздает некоторые аналогичные синусоидальные данные с вашими, добавил маленькая, но не слишком большая ошибка, и результат такой же неустойчивый.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def my_func(x, y):
    return np.sin(x**2 + y**2)

x = np.linspace(0, 3, 61)
y = np.linspace(0, 3, 61)
X,Y = np.meshgrid(x, y)

# add some error to our function: for f(x,y) in the range of [-1,1]
# the noise has a standard deviation of 1/25 = 0.04
# which is close to the spacing in the mesh grid so it's noticeable
Z = my_func(X, Y) + np.random.standard_normal((len(x), len(y)))/25

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X,Y,Z)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Approximation')
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...