Как раскрасить метки дендрограммы с помощью R на основе имени метки, а не группировки

Я пытаюсь раскрасить метки дендрограммы на основе части имени метки. Имя метки происходит от имен файлов в папке. Файлы представляют собой файлы .txt и называются следующим образом: 167_001.txt, где первые три числа указывают на конкретного автора текста, а последние три числа обозначают отдельные фрагменты, написанные этим автором. Я хочу пометить ветки по полному имени файла, но раскрасить метку только на основе первых трех чисел, чтобы я мог видеть, какие работы конкретного автора могут иметь больше общего с другим автором, чтобы увидеть, кто на кого повлиял. Это средневековые авторы, поэтому вы не поможете мне найти современных авторов, которые могли бы что-то заимствовать. Поэтому, если файл начинается с 080, я хочу, чтобы все файлы 080 были одного цвета, независимо от того, какова последняя часть имени файла и где бы он ни сгруппирован, но я все же хочу, чтобы конечная часть файла находилась в название ярлыка. Вот что у меня есть на данный момент:

# Load data
data(USArrests)
dd <- dist(scale(USArrests), method = "euclidean")

#Perform a cluster analysis on the distance object 
hc <- hclust(dd)
#Get the text file names to use as labels


dend <- as.dendrogram(hc)

dend2 = color_unique_labels(dend)
d5gr=color_branches(dend2,5,groupLabels=TRUE)
#plot(d5gr)
plot(d5gr, horiz=TRUE)

Как видите, я использую пакет dendextend. Если у кого-то есть лучший пакет или тот, который также выполнит то, что мне нужно, это было бы здорово. То, что у меня сейчас есть, помещает файлы в одно и то же цветовое семейство, поскольку они достаточно похожи, функция "color_unique_labels", предлагаемая dendextend, по крайней мере, окрашивает их в оттенки одного цвета, но это не делает их точно такого же цвета, что и Я бы хотел, чтобы один и тот же автор всегда был одного цвета, и тогда было бы легче увидеть, какие работы имеют общие черты с разными авторами. Увидеть ниже. Существует несколько сотен разных авторов, поэтому я бы предпочел не назначать каждому индивидуальный цвет вручную (A = "красный", B = "синий", C = "орхидея" и т. Д.), Но предпочел бы что-то, что работает как color_unique_labels и автоматически выбирает и назначает цвет на основе первых 3 чисел в имени файла. В моем примере используется пакет USArrests, и я, возможно, хотел бы увидеть, как раскрасить имена состояний по первой букве, чтобы все состояния «A», состояния «C» и т. Д. Были одного цвета. Таким образом, Алабама, Аляска, Аризона и Арканзас должны быть одного цвета, а Калифорния, Колорадо и Коннектикут также должны быть одного цвета. Опять же, я бы предпочел найти способ сделать его более автоматизированным, поскольку в моем реальном наборе данных есть несколько сотен возможностей, а не только 50, однако я не против, если это единственный вариант. Заранее спасибо!

dendextend дендрограмма с использованием функции color_unique_labels


person DHranger    schedule 31.03.2017    source источник
comment
Добавьте простой воспроизводимый пример, с которым люди будут работать. Я также не понимаю критериев окраски этикетки в зависимости от автора, но не назначаю каждому автору индивидуальный цвет. Кажется, между ними есть разногласия.   -  person gung - Reinstate Monica    schedule 31.03.2017
comment
Пытаемся найти простой воспроизводимый пример. Проблема в том, что многие предложения, которые я пробовал ранее, не работают с моим набором данных, хотя это похоже на аналогичную проблему. Поскольку дендрограмма сравнивает текст каждого файла и группирует их на основе текстового сходства, но маркирует их на основе имени файла, а не текста, содержащегося в файле, я продолжаю получать различные ошибки. Что касается путаницы с моей формулировкой, я отредактировал свой вопрос, чтобы прояснить, но в основном я не хочу вручную назначать каждому автору цвет, но предпочел бы автоматизированный процесс, если это поможет.   -  person DHranger    schedule 01.04.2017
comment
Часто я обнаруживаю, что в процессе выяснения того, как создать воспроизводимый пример, чтобы задавать вопросы людям, я сам нахожу решение. Вам не понадобится большая часть кода, который вы показываете для простого примера. Вы знаете, как извлекать нужные числа из имен файлов, например? Если да, то это можно пропустить. Кроме того, если единственная проблема с цветами для авторов заключается в том, что вы не хотите вручную назначать их, это тривиально.   -  person gung - Reinstate Monica    schedule 01.04.2017
comment
DHranger Я не понимаю, почему простое использование label_colors с метками не поможет. Как написал @gung, пожалуйста, предоставьте ПРОСТОЙ воспроизводимый пример, и мы с радостью попытаемся продемонстрировать это в ответе.   -  person Tal Galili    schedule 01.04.2017
comment
Хорошо, настолько просто и воспроизводимо, насколько это возможно. Опять же, нужно, чтобы они раскрашивались на основе первых нескольких частей имени файла. В этом примере набора данных, как мне покрасить все состояния A в красный цвет, а состояния C в зеленый, а состояния M в фиолетовый, но при этом на метке все равно будет отображаться полное имя состояния. Как мне сделать это, не выписывая полное имя или имена и приравнивая их к цвету (Аляска, Алабама, Аризона, Арканзас) = красный, поскольку это займет гораздо больше времени, чем я надеюсь потратить, поскольку есть сотни авторов и тысячи отдельных файлов (поскольку у каждого автора есть несколько работ).   -  person DHranger    schedule 03.04.2017


Ответы (1)


Надеюсь, на ваш вопрос уже был дан ответ. Если это все еще полезно для вас, вот моя попытка решить эту проблему:

Сначала вы создаете новую переменную, которая группирует авторов по их категориям (вы что-то сказали о начале категориальной переменной, которая у вас уже была). В зависимости от количества категорий, которые вы хотите создать, вам понадобится другой код, проверьте переменные Quick R Recoding раздел и этот учебник по recode (), чтобы узнать, что может сработать для ваш конкретный случай.

Если это окажется затруднительным в R, возможно, попробуйте сгенерировать групповую переменную в Excel - у него есть хорошая функция фильтрации, которая поможет вам быстро заполнить ссылочный код. Для будущего управления набором данных / фреймами данных я могу порекомендовать разделить его на столько переменных, сколько у вас есть на самом деле: если я правильно понимаю вашу проблему, похоже, что часть проблемы связана с наличием двух категориальных переменных в одной (группа + автор = имя файла) .

После того, как у вас есть групповая переменная ("GROUP"), вам нужно назначить ей набор цветов:

library(dendextend)
library(colorspace)

#make GROUP color palette: 

GROUP <-dataframe$GROUP #factorize group variable
n_GROUP <- length(unique(GROUP)) #count nr of unique groups
cols <- rainbow_hcl(n_GROUP) #select a number of colors based on GROUP size
col_GROUP <- cols[GROUP] #make color palette assigning the selected colors to the groups

Вот где на самом деле имеет место трюк с «цветными метками по категориям»: после того, как вы сделали дендрограмму, но перед ее построением, вы сортируете свои цвета в соответствии с дендрограммой. (dend):

dend <- as.dendrogram(hc) #hc into dendrogram

#sort GROUP color palette according to dend:
col_GROUP <- col_GROUP[order.dendrogram(dend)] 

#plot dendrogram as you would normally do, I did this:
dend <- dend %>% 
set("labels_colors", col_GROUP) %>% #change label colors to GROUP
plot(main = "Dendrogram with labels colored according to GROUP")
legend("topleft", legend = levels(GROUP), fill = cols, cex = 0.5)

Это должно окрасить ваши ярлыки в соответствии с их групповой категорией. То же самое можно сделать, если вы хотите также изменить имена меток (т.е. изменить уникальные имена, необходимые для анализа, на более крупные имена категорий). Вы просто сортируете фактор GROUP в соответствии с dend и устанавливаете метки при построении графика в GROUP (см. Dendextended :: set в справке R для параметров построения).

Надеюсь, это поможет, ура!

person Milan    schedule 06.07.2017