#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. спасибо тебе, Бен, и вы оба предлагаете отличное решение!