Проблема порядка визуализации данных в R

#r #boxplot

#r #коробочный график

Вопрос:

Здравствуйте, я пытаюсь визуализировать некоторые данные в виде Boxplot, используя 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
 

Комментарии:

1. Ваш cc_variant — это не фактор. Попробуйте использовать data$cc_variant <- factor(data$cc_variant, levels = c("Fallow", "Mustard", "Mix4", "Mix12")) после прочтения ваших данных, и после этого порядок уровней факторов будет правильным для меток. Если вы создаете коэффициент, но не устанавливаете уровни, они будут расположены в алфавитном порядке.

2. @Бен вау! после слишком большого количества сообщений об этой проблеме я был безнадежен, чтобы найти решение! Это работает как по волшебству ! Большое спасибо !

Ответ №1:

Попробуйте внести это изменение в свой код. Вы можете вычислить положение для меток, используемых aggregate() на вашем data компьютере, а затем объединить их с объектом, который вы используете для 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"))
 

Выходной сигнал:

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

Комментарии:

1. спасибо тебе, Бен, и вы оба предлагаете отличное решение!