0

我正在尝试创建一些帕累托图的变体。沿着代码前进,我面临一个我自己几个小时都无法解决的问题。这是关于包 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))

在此处输入图像描述

--> 对其他评论的回答:所以基本上我的问题是酒吧没有标上物种名称。我知道这是由于我的 dummyvar 导致的结果,它基本上是 1 到 22。所以我尝试强制 ggplot 用我想要的值命名 x 轴。但是这个输入不起作用

p <- p + scale_x_discrete(labels = labelb)

但回到你的建议:Jeah,我在创建这篇文章后尝试了 tidyverse,但处理得不够好。但是您的想法对我没有任何帮助,就像使用 ggplot 命令一样。

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

带 dplyr 的无序条形字符

4

2 回答 2

0

我使用您提供的数据库示例编辑了您的代码,我想我能够做您想做的事。

基本上我Beech根据降序排序,然后将其转换为因子。这是修改后的代码和结果:

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)因为它适用于数字而不是因子。

于 2020-08-03T14:07:37.967 回答
0

我不能从图片中完全看出出了什么问题,但是确保条形图按升序/降序排列的一种方法是到arrange列,然后使用类别的现有顺序将其转换为因子:

因此,无需订购:

library(tidyverse)

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

在此处输入图像描述

并订购:

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")

在此处输入图像描述

于 2020-08-01T17:30:31.900 回答