R中数据可视化的顺序问题

Problem of the order of visualizing the data in R

你好,我正在尝试使用 R 以箱线图的形式可视化一些数据。但是,数据在横坐标 x 中的显示顺序错误。我试图修复这个函数 scale_x_discrete(limits=c("Fallow", "Mustard", "Mix4", "Mix12")),这部分解决了问题,因为一些小字母(a、ac、bc、c)没有正确排序。正确的顺序是 (a, ab, bc, c).

这是情节的代码:

library(tidyverse)
library(lme4)
library(emmeans)
library(multcomp)

# set theme for ggplot
theme_set(theme_bw())
theme_myBW <- theme(axis.title.x = element_text(size = 10, color = "black"), 
                    axis.title.y = element_text(angle = 90, vjust = 1.5, size = 10, color = "black"),
                    axis.text.x = element_text(size = 10, color = "black"), 
                    axis.text.y = element_text(size = 10, color = "black"), 
                    axis.ticks =element_line(colour="black"),
                    strip.text.x = element_text(size = 10, color = "black"),
                    strip.background = element_blank(),
                    panel.border =element_rect(colour="black", fill=NA), 
                    panel.grid.major = element_blank(),
                    panel.grid.minor = element_blank(),
                    plot.title = element_text(size = 12, hjust=0.5),
                    #legend.position=c(0.0,1.0), 
                    #legend.justification=c(0,1), 
                    legend.text = element_text(size = 10),
                    legend.text.align=0,
                    legend.title =  element_text(size = 10), 
                    legend.key = element_rect(colour="white", fill = "white"),
                    legend.key.size = unit(5, "mm"),
                    legend.background = element_blank())

# set vector with colors and label
COL <- c("Fallow" = "slategray", "Mustard" = "red3" , "Mix4" = "orchid3", "Mix12"= "orange4")
SHP <- c("Fallow"=21,"Mustard"=22,"Mix4"=23, "Mix12"=24)


# generate data from csv file
data <- read.csv2("data.csv", as.is=T)
data$NEE <- as.numeric(data$NEE)


lm_NEE <- lmer(NEE ~ cc_variant + (1|Date), data=data)
df_NEE <- cld(emmeans(lm_NEE, specs ="cc_variant"), Letters=letters, sort=FALSE)

# Plot for BFS
ggplot(data, aes(x= cc_variant, y=NEE, fill= cc_variant))+
  geom_boxplot()+
  scale_fill_manual(values = COL, guide=FALSE)+
  geom_text(data= df_NEE ,aes(y=-600,x=cc_variant, label=.group))+
  labs(x="Catch crop variant",  y=expression("NEE (mg CO"[2]~"- C"~m^{-2}~h^{-1}~")"), fill="")+
  theme_myBW+scale_x_discrete(limits=c("Fallow", "Mustard", "Mix4", "Mix12"))

这是显示的数字:

情节应该是这样显示的:

csv中的数据是这样写的:

cc_variant;Date;NEE
Fallow;18.10.2016;52.31861
Fallow;19.10.2016;36.75274
Fallow;24.10.2016;34.59082
Mix4;18.10.2016;-516.86837
Mix12;18.10.2016;-617.11000
Mustard;18.10.2016;-182.24568
Mix4;19.10.2016;-102.63776
Mix12;19.10.2016;-431.55887
Mustard;19.10.2016;-139.04121
Mustard;24.10.2016;-114.09939
Mix12;24.10.2016;-400.21260
Mix4;24.10.2016;-175.33208

尝试对您的代码进行此更改。您可以使用 data 上的 aggregate() 计算标签的位置,然后与您在 geom_text() 中使用的对象合并,通过某个标量(假设为 10)调整位置。这里是代码(我已经更新了,因为我没有注意到问题是关于轴标签的。非常感谢并归功于 @Ben):

library(tidyverse)
library(lme4)
library(emmeans)
library(multcomp)
# generate data from csv file
data <- read.csv2("data.csv", as.is=T)
data$NEE <- as.numeric(data$NEE)
data$cc_variant<-factor(data$cc_variant, levels = c("Fallow", "Mustard", "Mix4", "Mix12"))
#Model
lm_NEE <- lmer(NEE ~ cc_variant + (1|Date), data=data)
df_NEE <- cld(emmeans(lm_NEE, specs ="cc_variant"), Letters=letters, sort=FALSE)
#Compute Position
Pos <- aggregate(NEE~cc_variant,data,min)
# Plot for BFS
ggplot(data, aes(x= cc_variant, y=NEE, fill= cc_variant))+
  geom_boxplot()+
  scale_fill_manual(values = COL, guide=FALSE)+
  geom_text(data= merge(df_NEE,Pos) ,
            aes(y=NEE-10,x=cc_variant, label=.group))+
  labs(x="Catch crop variant",  y=expression("NEE (mg CO"[2]~"- C"~m^{-2}~h^{-1}~")"), fill="")+
  theme_myBW+scale_x_discrete(limits=c("Fallow", "Mustard", "Mix4", "Mix12"))

输出: