3D Scatterplot со строками в Python - PullRequest
0 голосов
/ 09 января 2019

Я попытался создать трехмерный график рассеяния в Python с категориями строк (т. Е. Функциями активации и решателями для нейронной сети) по x и y и с плавающими числами (т. Е. Показателем точности NN) по оси z.

Следующий пример вызывает ошибку: ValueError: не удалось преобразовать строку в число с плавающей точкой: 'str1'

Я следовал этой документации для 3D-графиков: https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html

Есть идеи, в чем может быть проблема? Большое спасибо заранее!

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
xs=['str1', 'str2']
print(type(xs))
ys=['str3', 'str4']
print(type(ys))
zs=[1,2]
ax.scatter(xs, ys, zs)

1 Ответ

0 голосов
/ 09 января 2019

Вы пытаетесь передать категориальные значения (строки) в качестве аргументов x и y. Это будет работать для 1d точечного графика, но в 3d вам нужно определить координаты пролета / декартовой системы. То, что вы в основном хотите получить, это строки в виде меток на осях X и Y. Чтобы получить желаемый график, вы можете сначала построить числовые значения, а затем переназначить метки в соответствии с вашими строковыми значениями.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

xs=['str1', 'str2']
ys=['str3', 'str4']
zs=[1,2]

ax.scatter(range(len(xs)), range(len(xs)), zs)
ax.set(xticks=range(len(xs)), xticklabels=xs,
       yticks=range(len(xs)), yticklabels=xs) 

Вы также можете установить метки, используя

plt.xticks(range(len(xs)), xs)
plt.yticks(range(len(ys)), ys)

Первый вариант, использующий ax, однако позволяет вам сделать то же самое в одной строке.

enter image description here

...