Легенда заказа в мультибаровой диаграмме ggplot2 - PullRequest
0 голосов
/ 06 декабря 2018

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

В этом примере это «Группа», которая находится в одном порядке в столбцах, иобратный порядок в легенде.

library(ggplot2)

# create data for tidy format
Category <- c("Category1","Category2","Category3","Category4","Category5","Category1","Category2","Category3","Category4","Category5","Category1","Category2","Category3","Category4","Category5")
GroupTitle <- c("GroupA","GroupA","GroupA","GroupA","GroupA","GroupB","GroupB","GroupB","GroupB","GroupB","GroupC","GroupC","GroupC","GroupC","GroupC")
Valuelst <- list()
for (i in 1:15){
  Valuelst[i] <- runif(1, min=0, max=1)
}
Valuelst <- unlist(Valuelst)
# make data frame
d <- data.frame(Category,GroupTitle,Valuelst)

# set factors and orders desired
d$Category <- factor(d$Category, levels = c("Category5","Category4","Category3","Category2","Category1"))
d$GroupTitle <- factor(d$GroupTitle, levels = c("GroupA","GroupB","GroupC"))

# make graph
ggplot(d, aes(x=Category, y=Valuelst, order = -as.numeric(GroupTitle))) + # order= -as.numeric() is one solution that I read
  geom_bar(aes(fill=GroupTitle), stat="identity", position="dodge") + 
  coord_flip() +
  scale_fill_manual("Legenda", values = c("GroupC" = "#deebf7", "GroupB" = "#3182bd", "GroupA" = "#9ecae1")) # scale_fill_manual is another I read

Output of the code

Я прокомментировал в коде пару мест, где я пробовал решения, которые видел в других местах.А именно, я убедился, что группы являются фактором, установил порядок этого фактора, использовал order = -as.numeric(GroupTitle) и попробовал scale_fill_manual, но все безрезультатно.

Ответы [ 3 ]

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

Вы были почти там с scale_fill_manual.

  scale_fill_manual("Legenda", 
                    values = c("GroupA" = "#9ecae1", "GroupB" = "#3182bd", "GroupC" = "#deebf7"),
                    breaks = c("GroupC", "GroupB", "GroupA")) 

Аргумент breaks устанавливает порядок.

Ordered Legend

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

Вариант 1 - Заказ: C, B и A

Чтобы поменять метки легенды, нужно всего лишь добавить: guides(fill = guide_legend(reverse = TRUE)).Сохранение исходного порядка столбцов: C, B и A.

ggplot(d, aes(x = Category,
              y = Valuelst,
              fill = GroupTitle)) +
  geom_bar(stat = "identity", position = "dodge") +
  coord_flip() +
  scale_fill_manual("Legenda",
                    values = c(
                      "GroupC" = "#deebf7",
                      "GroupB" = "#3182bd",
                      "GroupA" = "#9ecae1"
                    )) +
  guides(fill = guide_legend(reverse = TRUE))

enter image description here

Вариант 2 - Заказ: A, B иC

Чтобы изменить порядок баров, мы просто изменим порядок уровней перед построением графика.

d$GroupTitle <- factor(d$GroupTitle, levels = c("GroupC","GroupB","GroupA"))

# make graph
ggplot(d, aes(x = Category,
              y = Valuelst,
              fill = GroupTitle)) +
  geom_bar(stat = "identity", position = "dodge") +
  coord_flip() +
  scale_fill_manual("Legenda",
                    values = c(
                      "GroupC" = "#deebf7",
                      "GroupB" = "#3182bd",
                      "GroupA" = "#9ecae1"
                    )) +
  guides(fill=guide_legend(reverse=TRUE))

enter image description here

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

Я использовал ggpubr библиотеку.Хитрость -0.7 для position_dodge(), которая делает перевернутые бары.Вы также можете использовать

library(ggplot2)
library(ggpubr)
# create data for tidy format
Category <- paste0("Category", rep(1:5,3))
GroupTitle <- paste0("Group", rep(LETTERS[1:3], each=5))
Valuelst <- runif(15, min=0, max=1)

# make data frame - factor is default for strings
d <- data.frame(Category, GroupTitle, Valuelst)

# make graph
ggbarplot(d,x="Category", y="Valuelst", fill="GroupTitle", legend = "right",
      orientation = "horiz", position=position_dodge(-.7), 
      order = c("Category5","Category4","Category3","Category2","Category1")) +
scale_fill_manual("Legenda", values = c("GroupC" = "#deebf7", "GroupB" = "#3182bd", "GroupA" = "#9ecae1")) 

enter image description here

Вы также можете использовать position=position_dodge(-.9) в geom_bar() для достижения того же эффекта.

ggplot(d, aes(x=Category, y=Valuelst, order = -as.numeric(GroupTitle))) + 
  geom_bar(aes(fill=GroupTitle), stat="identity", position=position_dodge(-.9)) + 
  coord_flip() +
  scale_fill_manual("Legenda", values = c("GroupC" = "#deebf7", "GroupB" = "#3182bd", "GroupA" = "#9ecae1")) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...