Как построить трехмерный график с осью Z, являющейся величиной значений в CSV? - PullRequest
0 голосов
/ 02 октября 2019

Я полагаю, что значения X и Y на графике должны быть представлены столбцами и линиями в CSV, который выглядит следующим образом:

0,original,1.0000,0.9999,0.9998,0.9997,0.9996,0.9995... 0.9900
1,28663,   4144,6096,6859,7366,7876,8125...
2,11268,   1374,2119,2393,2615,2809,2904...
3,14734,   2122,3115,3466,3740,4011,4144...
4,13341,   1452,2322,2689,2877,3114,3238...
5,18458,   2677,3643,4047,4333,4652,4806...
6,13732,   1621,2224,2502,2704,2930,3020...
7,17771,   2955,3904,4270,4566,4872,5041...
8,14447,   1822,2437,2715,2933,3179,3292...
.
.
.
5400,18458,2677,3643,4047,4333,4652,4806

Я хотел бы вывести свои данные на графике. Если я делаю это в 2D-графике, это выглядит ужасно.

Изображение 1 показывает эти данные в формате 2D, каждый ряд столбцов имеет свой цвет, "исходные" значения, например, синий ряд. Мне кажется, что было бы лучше визуальное представление, если бы это было 3D. enter image description here

Я бы искал что-то вроде изображения 2 . Я понимаю, что значения Z - это величина каждой ячейки в таблице . Я полагаю, что я должен был бы построить кучу различных серий (где каждая серия происходит из каждого целого столбца в CSV). Я прав?

enter image description here

Как говорится, мой вопрос: Как я могу отобразить мои данные .csv в 3D-графикеУчитывая ситуацию, на которую я указал?

РЕДАКТИРОВАТЬ: Я нашел код, который вроде как делает то, что я хочу. Я получил это от здесь . Я предполагаю, что я хотел бы применить каждый столбец как np.meshgrid (DataAll1D [:, 0] добавляет столбец 0 к графику. Кажется, что функция meshgrid принимает любое количество 1D массивов, которые я просто не делаюзнать, как это сделать в Python.

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

DataAll1D = np.loadtxt("datacsv_1d.csv", delimiter=",")
# create 2d x,y grid (both X and Y will be 2d)
X, Y = np.meshgrid(DataAll1D[:,0], DataAll1D[:,1])

# repeat Z to make it a 2d grid
Z = np.tile(DataAll1D[:,2], (len(DataAll1D[:,2]), 1))

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

1 Ответ

1 голос
/ 02 октября 2019

Очень минимальный пример, но я думаю, что вы хотите добиться, чтобы каждая из ваших кривых была отделена от других в трехмерном пространстве. Код ниже генерирует два графика, один из которых рисует кривые по отдельности, а другой обрабатывает входные данные как поверхность. Я думаю, вы можете легко развить это и достичь более конкретной цели.

from mpl_toolkits.mplot3d import Axes3D  # noqa: F401 unused import
import matplotlib.pyplot as plt
import numpy

data = numpy.array([[28663, 4144, 6096, 6859, 7366, 7876, 8125],
                    [11268, 1374, 2119, 2393, 2615, 2809, 2904],
                    [14734, 2122, 3115, 3466, 3740, 4011, 4144],
                    [13341, 1452, 2322, 2689, 2877, 3114, 3238],
                    [18458, 2677, 3643, 4047, 4333, 4652, 4806],
                    [13732, 1621, 2224, 2502, 2704, 2930, 3020]])
fig, (ax, bx) = plt.subplots(nrows=1, ncols=2, num=0, figsize=(16, 8),
                             subplot_kw={'projection': '3d'})
for i in range(data.shape[1]):
    ax.plot3D(numpy.repeat(i, data.shape[0]), numpy.arange(data.shape[0]),
              data[:, i])
gridY, gridX = numpy.mgrid[1:data.shape[0]:data.shape[0] * 1j,
                           1:data.shape[1]:data.shape[1] * 1j]
pSurf = bx.plot_surface(gridX, gridY, data, cmap='viridis')
fig.colorbar(pSurf)
plt.show()

enter image description here

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