3D-график с категориальной осью [Python / Matplotlib]

#python-2.7 #numpy #matplotlib #pandas

#python-2.7 #numpy #matplotlib #панды

Вопрос:

Пытаюсь построить трехмерный график с:

ось x — значения (с плавающей точкой) ось y — значения (с плавающей точкой) ось z — Категория (строка)

Теперь я попытался преобразовать вектор z с помощью pandas.factorize (таблица.zcolumn)

 Output: (array([ 0,  0,  0, ..., -1, -1,  1]), Index([u'London', u'National'], dtype='object'))
  

Поэтому я могу без проблем выводить числа.

Вы увидите, что есть значения NaN, которые преобразуются в -1, поэтому, когда я строю график, есть куча значений в -1. Данные содержат категории London, National и NaN.

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

На оси z мне нужно переназначить галочки -1, чтобы они стали ‘NA’, 0, чтобы стать ‘London’ и 1, чтобы стать ‘National’

Мне также было бы интересно найти способ сделать это с большим количеством категорий, поэтому код, который не требует ручного ввода каждой строки категории

 regions = pandas.factorize(dataTable.Region[id_range])
regions_num = regions[0]

fig = plot.figure()
ax = fig.add_subplot(111,projection='3d')
ax.scatter(y, x, zs=regions_num)

ax.axes.set_zticklabels(["London","National","N/A"])

plot.show()
  

Проблема: метки оси Z не соответствуют дискретным значениям (при -1, 0, 1)

Ответ №1:

Вам просто нужно установить zticks в три z-значения, соответствующие вашим категориям:

 ax.axes.set_zticks(regions_num)
  

Сказав это, я не думаю, что это на самом деле очень хороший способ построения ваших данных. 3D-графики наиболее полезны, когда все ваши значения X, Y и Z являются непрерывными переменными. Представление регионов в виде разных z-уровней могло бы иметь немного больше смысла, если бы ‘region’ был порядковой переменной, но есть ли какая-либо причина, по которой 'N/A' должно быть ‘выше’, чем 'National' ? 3D-графики также, как правило, труднее читать, чем 2D-графики — например, из-за перспективной проекции точка, которая находится поблизости в 'National' категории, может выглядеть очень похоже на точку, которая находится дальше, но в 'N/A' категории.

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

Комментарии:

1. Спасибо, это работает. Я полностью понимаю, что вы имеете в виду во втором пункте. Но я в основном использую это как упражнение по кодированию. Почему-то мне не удается установить метки в виде строк? Могу ли я не использовать ax.axes.set_zticklabels(regions[1][:]) для установки каждой метки? Он печатает все друг на друге в данный момент

2. @darkace ну, что такое regions[1][:] ?