Добавьте метки подгруппы / элементы порядка на оси x в ggplot2 r - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь добавить sub-group labels и упорядочить наблюдения по оси x в моем .Здесь уже есть несколько вопросов по этому поводу, но все ответы рекомендуют использовать фасетку (например, здесь ).Мой сюжет уже огранен, так что эти ответы не работают для меня.Я попытался использовать reorder(x, by_this_variable), но, похоже, это работает, только если by_this_variable является осью Y.Зачем?Если я пытаюсь переупорядочить его с помощью другой переменной, я получаю предупреждение:

аргумент не является числовым или логическим

Чтобы быть более точным, я намечаю две точки(проценты по участнику, полученные в двух разных задачах) для каждого дискретного значения оси X (1 для каждого участника) со стрелками, соединяющими точки для каждого участника.Это указывает на то, было ли на поведение участников оказано отрицательное или положительное влияние на задачи.Мои аспекты - это 2 разных состояния (лечение), в которые участники были случайным образом отсортированы.Теперь я хотел бы сгруппировать график с точками и стрелками в соответствии с различными источниками участников (возможный предиктор для разных ответов на лечение) и добавить эту информацию в качестве метки на оси X, но все, чего я могу достичь прямо сейчас, - это иметьзначения отсортированы в алфавитном порядке (по умолчанию).

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

Мой код:

Data <- data.frame(c(28.5, 20, 55.4, 30.5, 66.6, 45.4, 43.2, 43.1, 28.5, 55.4, 30.5, 
                   66.6, 45.4, 20), c("Participant 1", "Participant 1", 
                   "Participant 2", "Participant 2", "Participant 3", 
                   "Participant 3","Participant 4", "Participant 4","Participant 5", 
                   "Participant 5", "Participant 6", "Participant 6", "Participant 7", 
                   "Participant 7"),c("India", "India", "India", "India", "Algeria", 
                   "Algeria", "Algeria", "Algeria", "India", "India", "India", 
                   "India", "Algeria", "Algeria"),c("Treatment A", "Treatment A", 
                   "Treatment B", "Treatment B","Treatment A", "Treatment A", 
                   "Treatment B", "Treatment B", "Treatment A", "Treatment A", 
                   "Treatment B", "Treatment B", "Treatment A", "Treatment A"),
                   c("Task 1", "Task 2", "Task 1", "Task 2", "Task 1", "Task 2", 
                   "Task 1", "Task 2", "Task 1", "Task 2", "Task 1", "Task 2", 
                   "Task 1", "Task 2"))
colnames(Data) <- c("Percentage", "Participant", "Origin", "Treatment", "Task")

ggplot(Data, aes(y=Percentage, x = Participant, group = Participant))+
   geom_point(aes(color = Task))+ 
   geom_line(arrow = arrow(length=unit(0.30,"cm"), type = "closed"), size = .3)+
   facet_grid(~Treatment, scales = "free_x", space = "free_x")+ 
   theme(axis.text.x = element_text(angle = 90, hjust = 1))

Это дает следующий сюжет:

Участок

Участники 1 и 5 из Индиии 3 и 7 из Алжира, поэтому я хотел бы сгруппировать их по оси X и добавить метку для происхождения.

РЕДАКТИРОВАТЬ:

Вышеприведенное предупреждение, как представляется, вытекает из того факта, чточто Origin является многоуровневым фактором (и, по-видимому, переупорядочение работает только с числовыми значениями), поэтому установка x = reorder (Participant, as.numeric (Origin)) упорядочит значения в соответствии с Origin, но как я могу добавить соответствующий Originнадписи под сюжетом?

1 Ответ

0 голосов
/ 18 декабря 2018

Одно из предложений - использовать упорядоченный коэффициент.Для уровней коэффициента сцепления Origin и Participant.Для меток фактора объедините Participant и Origin.

# The unique values from the column 'Origin_Participant' will act as the levels
# of the factor. The order is imposed by 'Origin', so that participants from
# same country group together.
Data$Origin_Participant <- paste(Data$Origin, Data$Participant, sep = "\n")
# The unique values from 'Participant_Origin' column will be used for the
# factor' labels (what will end up on the plot).
Data$Participant_Origin <- paste(Data$Participant, Data$Origin, sep = "\n")
# Order data.frame by 'Origin_Participant'. Is also important so that the levels
# correspond to the labels of the factor when creating it below.
Data <- Data[order(Data$Origin_Participant),]
# Or in decreasing order if you need
# Data <- Data[order(Data$Origin_Participant, decreasing = TRUE),]

# Finally, create the needed factor.
Data$Origin_Participant <- factor(x = Data$Origin_Participant,
                                  levels = unique(Data$Origin_Participant),
                                  labels = unique(Data$Participant_Origin),
                                  ordered = TRUE)

library(ggplot2)
# Reuse your code, but map the factor `Origin_Participant` into x. I think there
# is no need of a grouping factor. I also added vjust = 0.5 to align the labels
# on the vertical center.
ggplot(Data, aes(y=Percentage, x = Origin_Participant))+
  geom_point(aes(color = Task))+ 
  geom_line(arrow = arrow(length=unit(0.30,"cm"), type = "closed"), size = .3)+
  facet_grid(~Treatment, scales = "free_x", space = "free_x")+ 
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

enter image description here

Если вам все равно, появляется Originсначала в метках, затем на несколько шагов короче:

Data$Origin_Participant <- factor(x = paste(Data$Origin, Data$Participant, sep = "\n"),
                                  ordered = TRUE)
ggplot(Data, aes(y=Percentage, x = Origin_Participant))+
  geom_point(aes(color = Task))+ 
  geom_line(arrow = arrow(length=unit(0.30,"cm"), type = "closed"), size = .3)+
  facet_grid(~Treatment, scales = "free_x", space = "free_x")+ 
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

enter image description here

...