ggplot2 的小提琴图不像 x 轴上的数据集那样有序
Violin plot of ggplot2 is not in order as in dataset on x-axis
我使用以下代码创建了 ,但是 在 x 轴上,模型名称与数据集中的顺序不一致(即 "Observed"、"SVM"、"Grid_SVM"、"MARS"、"Grid_Mars"、"RF"、"Grid_RF")。
代码中哪里需要修改?
ggplot(df1, aes(x = Model, y = Pb), cex.lab = 18, cex.axis=18) +
geom_violin(trim=FALSE, fill = "palegreen") +
geom_boxplot(width = .12, fill = "orange", outlier.color = "orange", outlier.size = 2) +
labs(title = "Pb Adsorption distribution by Models over testing phase") + xlab("Models") + ylab("Pb Adsorption distribution")+ theme_classic() +
theme(
plot.title = element_text(size = 12, colour = "black", face = "bold"), #for Main Title
axis.title.x = element_text(size = 12, colour = "black", face = "bold"), #for axix title
axis.title.y = element_text(size = 12, colour = "black", face = "bold"),
axis.text.x = element_text(face="bold", color="darkblue", size=12, angle=0), #for axis tick
axis.text.y = element_text(face="bold", color="black", size=12, angle=0))
默认情况下,ggplot2 按字母顺序绘制字符向量。要为您的图下达指定订单,只需使用 dplyr 并将列创建为 factor()
并指定您想要的级别。然后 ggplot2 应该根据需要绘制它。
编辑#1
一种方法是将 df1
数据框与您的 ggplot2 命令字符串分开修改。你可以这样做
df1 <- df1 %>%
mutate( Model=factor(Model,levels=c("Observed", "SVM", "Grid_SVM", "MARS", "Grid_Mars", "RF", "Grid_RF")) )
然后调用上面发布的 ggplot2 命令字符串。
编辑 #2(来自下面的评论)
如果你想把所有事情都通过管道并一次完成所有事情,试试
df1 %>%
mutate( Model=factor(Model,levels=c("Observed", "SVM", "Grid_SVM", "MARS", "Grid_Mars", "RF", "Grid_RF")) ) %>%
ggplot( aes(x = Model, y = Pb), cex.lab = 18, cex.axis=18) +
geom_violin(trim=FALSE, fill = "palegreen") +
geom_boxplot(width = .12, fill = "orange", outlier.color = "orange", outlier.size = 2) +
labs(title = "Pb Adsorption distribution by Models over testing phase") + xlab("Models") + ylab("Pb Adsorption distribution")+ theme_classic() +
theme(
plot.title = element_text(size = 12, colour = "black", face = "bold"), #for Main Title
axis.title.x = element_text(size = 12, colour = "black", face = "bold"), #for axix title
axis.title.y = element_text(size = 12, colour = "black", face = "bold"),
axis.text.x = element_text(face="bold", color="darkblue", size=12, angle=0), #for axis tick
axis.text.y = element_text(face="bold", color="black", size=12, angle=0))
原来的建议是覆盖数据。然后在新链中生成图。
df1 <- df1 %>%
mutate( Model=factor(Model,levels=c("Observed", "SVM", "Grid_SVM", "MARS", "Grid_Mars", "RF", "Grid_RF")) )
ggplot( df1, aes(x = Model, y = Pb), cex.lab = 18, cex.axis=18) +
geom_violin(trim=FALSE, fill = "palegreen") +
geom_boxplot(width = .12, fill = "orange", outlier.color = "orange", outlier.size = 2) +
labs(title = "Pb Adsorption distribution by Models over testing phase") + xlab("Models") + ylab("Pb Adsorption distribution")+ theme_classic() +
theme(
plot.title = element_text(size = 12, colour = "black", face = "bold"), #for Main Title
axis.title.x = element_text(size = 12, colour = "black", face = "bold"), #for axix title
axis.title.y = element_text(size = 12, colour = "black", face = "bold"),
axis.text.x = element_text(face="bold", color="darkblue", size=12, angle=0), #for axis tick
axis.text.y = element_text(face="bold", color="black", size=12, angle=0))
以上任何一个都可以。
我使用以下代码创建了
ggplot(df1, aes(x = Model, y = Pb), cex.lab = 18, cex.axis=18) +
geom_violin(trim=FALSE, fill = "palegreen") +
geom_boxplot(width = .12, fill = "orange", outlier.color = "orange", outlier.size = 2) +
labs(title = "Pb Adsorption distribution by Models over testing phase") + xlab("Models") + ylab("Pb Adsorption distribution")+ theme_classic() +
theme(
plot.title = element_text(size = 12, colour = "black", face = "bold"), #for Main Title
axis.title.x = element_text(size = 12, colour = "black", face = "bold"), #for axix title
axis.title.y = element_text(size = 12, colour = "black", face = "bold"),
axis.text.x = element_text(face="bold", color="darkblue", size=12, angle=0), #for axis tick
axis.text.y = element_text(face="bold", color="black", size=12, angle=0))
默认情况下,ggplot2 按字母顺序绘制字符向量。要为您的图下达指定订单,只需使用 dplyr 并将列创建为 factor()
并指定您想要的级别。然后 ggplot2 应该根据需要绘制它。
编辑#1
一种方法是将 df1
数据框与您的 ggplot2 命令字符串分开修改。你可以这样做
df1 <- df1 %>%
mutate( Model=factor(Model,levels=c("Observed", "SVM", "Grid_SVM", "MARS", "Grid_Mars", "RF", "Grid_RF")) )
然后调用上面发布的 ggplot2 命令字符串。
编辑 #2(来自下面的评论)
如果你想把所有事情都通过管道并一次完成所有事情,试试
df1 %>%
mutate( Model=factor(Model,levels=c("Observed", "SVM", "Grid_SVM", "MARS", "Grid_Mars", "RF", "Grid_RF")) ) %>%
ggplot( aes(x = Model, y = Pb), cex.lab = 18, cex.axis=18) +
geom_violin(trim=FALSE, fill = "palegreen") +
geom_boxplot(width = .12, fill = "orange", outlier.color = "orange", outlier.size = 2) +
labs(title = "Pb Adsorption distribution by Models over testing phase") + xlab("Models") + ylab("Pb Adsorption distribution")+ theme_classic() +
theme(
plot.title = element_text(size = 12, colour = "black", face = "bold"), #for Main Title
axis.title.x = element_text(size = 12, colour = "black", face = "bold"), #for axix title
axis.title.y = element_text(size = 12, colour = "black", face = "bold"),
axis.text.x = element_text(face="bold", color="darkblue", size=12, angle=0), #for axis tick
axis.text.y = element_text(face="bold", color="black", size=12, angle=0))
原来的建议是覆盖数据。然后在新链中生成图。
df1 <- df1 %>%
mutate( Model=factor(Model,levels=c("Observed", "SVM", "Grid_SVM", "MARS", "Grid_Mars", "RF", "Grid_RF")) )
ggplot( df1, aes(x = Model, y = Pb), cex.lab = 18, cex.axis=18) +
geom_violin(trim=FALSE, fill = "palegreen") +
geom_boxplot(width = .12, fill = "orange", outlier.color = "orange", outlier.size = 2) +
labs(title = "Pb Adsorption distribution by Models over testing phase") + xlab("Models") + ylab("Pb Adsorption distribution")+ theme_classic() +
theme(
plot.title = element_text(size = 12, colour = "black", face = "bold"), #for Main Title
axis.title.x = element_text(size = 12, colour = "black", face = "bold"), #for axix title
axis.title.y = element_text(size = 12, colour = "black", face = "bold"),
axis.text.x = element_text(face="bold", color="darkblue", size=12, angle=0), #for axis tick
axis.text.y = element_text(face="bold", color="black", size=12, angle=0))
以上任何一个都可以。