Как использовать категориальные данные для отображения отсортированной гистограммы, содержащей повторяющиеся значения - PullRequest
1 голос
/ 03 июня 2019

У меня есть этот пример данных:

names = ["JFK", "BOS", "YYZ", "LAX"];
values = [1, 2, 2, 3];

Я создаю создать categorical массив :

>> cat = categorical(names)

cat = 

  1×4 categorical array

     JFK      BOS      YYZ      LAX 

И я создаю горизонтальную гистограмму с данными:

barh(cat, values);

и вот так выглядит вывод:

unsorted bar graph

Как видите, ось Y гистограммы автоматически сортируется в алфавитном порядке, но вместо этого я бы хотел отсортировать гистограмму на основе значений. Где категория с наибольшим значением размещается в верхней части графика, а категория с наименьшим значением в нижней части графика, например:

LAX -| XXXXXXXXX
YYZ -| XXXXXX
BOS -| XXXXXX
JFK -| XXX

Как я могу это сделать?

1 Ответ

1 голос
/ 03 июня 2019

Документация barh действительно говорит (курсив добавлен)

По умолчанию , категории отображаются в алфавитном порядке.

Однако я не нашел опции ввода для переопределения этого поведения по умолчанию.

Обходной путь выглядит следующим образом:

  1. Применить sort кзначения и получить второй вывод этой функции.Здесь указывается, какой порядок следует применить к cat.
  2. . Постройте значения без указания категориальных данных в качестве первого ввода.
  3. Измените отметки оси на названия категорий.Вы можете использовать string для преобразования категорий в названия категорий (после применения соответствующего порядка).

То есть:

[values_sorted, ind_sort] = sort(values);       % step 1
barh(values_sorted)                             % step 2
set(gca, 'yticklabel', string(cat(ind_sort)))   % step 3

Другой подход, как уже упоминалосьв комментариях, это создать категориальный массив с соответствующим порядком, встроенным в него. Видимо это можно сделать следующим образом (не знаю, как это работает):

names = ["JFK", "BOS", "YYZ", "LAX"];
values = [1, 2, 2, 3];
[~, ind_sort] = sort(values);
names_char = cellfun(@char, names, 'UniformOutput', false);
cat = categorical(ind_sort, ind_sort, names_char);

Так что теперь

barh(cat, values)

работает как задумано.

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