Проблема с именованием оси x с помощью ggplot2 в Rstudio - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь создать какой-то вариант диаграммы Парето. Продвигаясь по коду, я сталкиваюсь с проблемой, которую не могу решить самостоятельно в течение нескольких часов. Это касается порядка данных пакета ggplot2 (1) и соответствующего переименования меток (2).

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

(2) У меня есть столбец в моем df, содержащий все виды, которые я хочу видеть на оси x. Однако ggplot не позволит распечатать их соответственно. На самом деле с тех пор, как я добавил команду, я не получу никаких надписей на оси x. Каким-то образом я не получу никакой ошибки.

Итак, мой вопрос: есть ли способ использовать мой список видов в качестве оси X? (Но помните, что мои данные должны быть отсортированы от высокого к низкому) Или некоторые легко найти способ решить проблему с маркировкой?

аплодисменты

dfb
     Beech id     proc     kommu    Order
1   Va fla  1 8.749851  8.749851  Psocopt
2       Er  2 7.793812 16.543663    Acari
3 Faga dou  3 7.659406 24.203069     Dipt
4      Tro  4 6.675941 30.879010    Acari
5  Hal ann  5 6.289307 37.168317     Dipt
6    Stigm  6 3.724406 40.892723    Acari
7   Di fag  7 3.642574 44.535297 Lepidopt
8    Phyfa  8 3.390545 47.925842 Neoptera
9   Phylma  9 2.766040 50.691881 Lepidopt

пример данных:

structure(list(Beech = c("Va fla", "Er", "Faga dou", "Tro", "Hal ann", 
"Stigm", "Di fag", "Phyfa", "Phylma"), id = c(1, 2, 3, 4, 5, 
6, 7, 8, 9), proc = c(8.749851, 7.793812, 7.659406, 6.675941, 
6.289307, 3.724406, 3.642574, 3.390545, 2.76604), kommu = c(8.749851, 
16.543663, 24.203069, 30.87901, 37.168317, 40.892723, 44.535297, 
47.925842, 50.691881), Order = c("Psocopt", "Acari", "Dipt", 
"Acari", "Dipt", "Acari", "Lepidopt", "Neoptera", "Lepidopt")), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))
library(openxlsx)
library(ggplot2)

dfb <- data.xlsx ###(df containing different % values per species)
labelb <- dfb$Beech ###(list of 22 items; same number as x-values)

p <-ggplot(dfb, aes(x=id))
p <- p + geom_bar(aes(y = proc), stat = "identity", fill = "lightgreen")
p <- p + geom_line(aes(y = kommu/10), color = "orange", size = 2) + geom_point(aes(y = kommu/10),size = 2)
p <- p + scale_y_continuous(sec.axis = sec_axis(~.*10, name ="Total biocoenosis[%]"))
p <- p + labs(y = "Species [%]",
              x = "Species")
p <- p + scale_x_discrete(labels = labelb)
p <- p + theme(legend.position = c(0.8, 0.9))

enter image description here

--> Answer to other comments: So basically my problem is the bars are not labeled with a species name. I know that this is a result due to my dummyvar, which is basically 1 to 22. So I try to force ggplot to name the x-axis with my wanted values. But this input doesn't work

p 

But back to your suggestions: Jeah, I tried tidyverse just after creating this post and couldn't handle it good enough. But your idea doesn't do anything for me, its like using the ggplot command.

  arrange(Beech) %>%
  mutate(Beech = factor(Beech, levels = unique(.$Beech))) %>%
  ggplot(aes(Beech, proc)) +
  geom_col()

неупорядоченный штрих-код с dplyr

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

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

В основном я отсортировал Beech в зависимости от убывающего pro c, а затем преобразовал его в фактор. Вот измененный код и результат:

p <-
  dfb %>% 
  arrange(desc(proc)) %>%
  mutate(Beech = factor(Beech, levels = unique(.$Beech))) %>%
  ggplot(aes(Beech)) +
  geom_bar(aes(y = proc), stat = "identity", fill = "lightgreen") +
  geom_line(aes(y = kommu/10, x=as.integer(Beech)), color = "orange", size = 2) + 
  geom_point(aes(y = kommu/10),size = 2) +
  labs(y = "Species [%]", x = "Species") +
  scale_x_discrete("Species") +
  scale_y_continuous(sec.axis = sec_axis(~.*10, name ="Total biocoenosis[%]")) + 
  theme(legend.position = c(0.8, 0.9))
p

введите описание изображения здесь

Примечание: мне пришлось немного подправить geom_line, добавив x=as.integer(Beech), потому что он работает с числами, а не с факторами.

0 голосов
/ 01 августа 2020

Я не могу точно сказать по картинке, что происходит не так, но один из способов убедиться, что ваши гистограммы расположены в порядке возрастания / убывания, - это arrange столбец, а затем преобразовать его в коэффициент, используя существующий порядок категории:

Итак, без заказа:

library(tidyverse)

diamonds %>%
  group_by(cut) %>%
  summarize(price = mean(price)) %>%
  ggplot(aes(cut, price)) +
  geom_bar(stat = "identity")

enter image description here

And with ordering:

diamonds %>%
  group_by(cut) %>%
  summarize(price = mean(price)) %>%
  arrange(price) %>%
  mutate(cut = factor(cut, levels = unique(.$cut))) %>%
  ggplot(aes(cut, price)) +
  geom_bar(stat = "identity")

введите описание изображения здесь

...