如何在保持 x 轴类别名称的同时根据 y 轴值对图形的 x 轴类别进行排序?
How do I order the x-axis categories of a graph according to y-axis values while maintaining the x-axis category names?
提前感谢任何可以帮助我的人。我正在制作几个湖泊中叶绿素浓度的 geom_point 图表(这些湖泊出现在两个不同的流域,这就是为什么我将它们分成两个方面)。我希望这些点按叶绿素浓度从最低到最高浓度排序(注意:我已经翻转了 y 轴)。我已经这样做了,但问题是,当我按叶绿素浓度对湖泊进行排序时,我必须在 x 轴上绘制 "site_order" 而不是 "site_name." 您可以从散列线中看到我尝试了两种不同的方法在 x 轴上绘制 site_names 的代码:
1) 我曾尝试将 site_name 级别分配给 site_order,但这不起作用。它为 x 轴类别生成了一个带有湖泊名称的图表,但这些湖泊没有与正确的数据相关联!我不确定 levels() 如何将 site_name 分配给 site_order,但它没有正确执行...(见图 1)。
2)我尝试使用 scale_x_discrete 将 x 轴标记为 site_name,但这会导致图表中没有任何 x 轴类别的标签(见图 2)。
我的代码和示例数据集如下。如果有人可以解决我的任何一种方法,或提出不同的方法,我将不胜感激!
这是我的示例数据集:
Watershed site_order site_name Morph Chla_percent
1 Six Mile Creek & Schutz Lake 19 Wassermann Deep 248.571429
2 Six Mile Creek & Schutz Lake 12 Church Deep 21.428571
3 Six Mile Creek & Schutz Lake 1 Kelser's Pond Deep -100.000000
4 Six Mile Creek & Schutz Lake 7 Steiger Deep -6.428571
5 Six Mile Creek & Schutz Lake 5 Zumbra Deep -40.000000
6 Six Mile Creek & Schutz Lake 4 Stone Deep -57.142857
7 Six Mile Creek & Schutz Lake 16 East Auburn Deep 107.857143
8 Six Mile Creek & Schutz Lake 9 West Auburn Deep 0.000000
9 Six Mile Creek & Schutz Lake 18 Turbid Deep 185.714286
10 Six Mile Creek & Schutz Lake 15 Schutz Deep 84.285714
11 Minnehaha Creek 11 Brownie Deep 20.285714
12 Minnehaha Creek 2 Calhoun Deep -70.714286
13 Minnehaha Creek 6 Cedar Deep -33.571429
14 Minnehaha Creek 3 Harriet Deep -67.142857
15 Minnehaha Creek 8 Hiawatha Deep -1.428571
16 Minnehaha Creek 13 Lake of the Isles Deep 74.285714
17 Minnehaha Creek 10 Nokomis Deep 13.571429
18 Minnehaha Creek 17 Powderhorn Deep 160.714286
19 Minnehaha Creek 14 Taft Deep 83.571429
这是我的代码:
#Import, fix up, and subset data
Data = read.csv("Lakes_data_for_R.csv",
stringsAsFactors=FALSE)
colnames(Data)[1] <- "Watershed"
Data <- Data[grep("Deep", Data$Morph),]
#Create site_order column (and if possible, assign levels of site_name to site_order)
Data$site_order <- rank(Data$Chla_percent)
#Data$site_order <- as.factor(Data$site_order)
#levels(Data$site_order) <- Data$site_name
#Load ggplot
library(ggplot2)
#Make plot
ggplot() +
geom_point(data = Data, aes(x = site_order, y = Chla_percent), size = 5, color = "blue") +
ylab ("Chlorophyll a (% difference from Poor threshold)") + xlab("") +
facet_grid(~Watershed, scale = "free", space = "free") +
scale_y_reverse() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, color = "black"),
axis.text.y = element_text(color = "black"),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
axis.line.x = element_line(color = "black"),
axis.line.y = element_line(color = "black"),
panel.background = element_rect(fill = "white"),
legend.key=element_blank(),
legend.title = element_blank(),
text = element_text(size=18),
panel.spacing = unit(2, "lines"))
#+scale_x_discrete(labels = Data$site_name)
这是图 1:
这是图 2:
重新排列这些类别的最简单方法是重新排列因子 site_name。这是一个最小的工作示例,后面是适用于您的示例的代码:
library(ggplot2)
library(dplyr)
myData <- iris %>% group_by(Species) %>% summarise(MeanSL =mean(Sepal.Length))
typeof(myData$Species)
ggplot(data=myData,aes(x=Species, y=MeanSL)) + geom_point()
myData$Species<- factor(myData$Species, levels=myData$Species[order(- myData$MeanSL)], ordered=TRUE)
ggplot(data=myData,aes(x=Species, y=MeanSL)) + geom_point()
在你的情况下,这应该可以解决问题:
Data$site_name <-factor(Data$site_name, levels=Data$site_name[order(- Data$Chla_percent)], ordered=TRUE)
ggplot() +
geom_point(data = Data, aes(x = site_name, y = Chla_percent), size = 5, color = "blue") +
ylab ("Chlorophyll a (% difference from Poor threshold)") + xlab("") +
facet_grid(~Watershed, scale = "free", space = "free") +
scale_y_reverse() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, color = "black"),
axis.text.y = element_text(color = "black"),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
axis.line.x = element_line(color = "black"),
axis.line.y = element_line(color = "black"),
panel.background = element_rect(fill = "white"),
legend.key=element_blank(),
legend.title = element_blank(),
text = element_text(size=18),
panel.spacing = unit(2, "lines"))
提前感谢任何可以帮助我的人。我正在制作几个湖泊中叶绿素浓度的 geom_point 图表(这些湖泊出现在两个不同的流域,这就是为什么我将它们分成两个方面)。我希望这些点按叶绿素浓度从最低到最高浓度排序(注意:我已经翻转了 y 轴)。我已经这样做了,但问题是,当我按叶绿素浓度对湖泊进行排序时,我必须在 x 轴上绘制 "site_order" 而不是 "site_name." 您可以从散列线中看到我尝试了两种不同的方法在 x 轴上绘制 site_names 的代码:
1) 我曾尝试将 site_name 级别分配给 site_order,但这不起作用。它为 x 轴类别生成了一个带有湖泊名称的图表,但这些湖泊没有与正确的数据相关联!我不确定 levels() 如何将 site_name 分配给 site_order,但它没有正确执行...(见图 1)。
2)我尝试使用 scale_x_discrete 将 x 轴标记为 site_name,但这会导致图表中没有任何 x 轴类别的标签(见图 2)。
我的代码和示例数据集如下。如果有人可以解决我的任何一种方法,或提出不同的方法,我将不胜感激!
这是我的示例数据集:
Watershed site_order site_name Morph Chla_percent
1 Six Mile Creek & Schutz Lake 19 Wassermann Deep 248.571429
2 Six Mile Creek & Schutz Lake 12 Church Deep 21.428571
3 Six Mile Creek & Schutz Lake 1 Kelser's Pond Deep -100.000000
4 Six Mile Creek & Schutz Lake 7 Steiger Deep -6.428571
5 Six Mile Creek & Schutz Lake 5 Zumbra Deep -40.000000
6 Six Mile Creek & Schutz Lake 4 Stone Deep -57.142857
7 Six Mile Creek & Schutz Lake 16 East Auburn Deep 107.857143
8 Six Mile Creek & Schutz Lake 9 West Auburn Deep 0.000000
9 Six Mile Creek & Schutz Lake 18 Turbid Deep 185.714286
10 Six Mile Creek & Schutz Lake 15 Schutz Deep 84.285714
11 Minnehaha Creek 11 Brownie Deep 20.285714
12 Minnehaha Creek 2 Calhoun Deep -70.714286
13 Minnehaha Creek 6 Cedar Deep -33.571429
14 Minnehaha Creek 3 Harriet Deep -67.142857
15 Minnehaha Creek 8 Hiawatha Deep -1.428571
16 Minnehaha Creek 13 Lake of the Isles Deep 74.285714
17 Minnehaha Creek 10 Nokomis Deep 13.571429
18 Minnehaha Creek 17 Powderhorn Deep 160.714286
19 Minnehaha Creek 14 Taft Deep 83.571429
这是我的代码:
#Import, fix up, and subset data
Data = read.csv("Lakes_data_for_R.csv",
stringsAsFactors=FALSE)
colnames(Data)[1] <- "Watershed"
Data <- Data[grep("Deep", Data$Morph),]
#Create site_order column (and if possible, assign levels of site_name to site_order)
Data$site_order <- rank(Data$Chla_percent)
#Data$site_order <- as.factor(Data$site_order)
#levels(Data$site_order) <- Data$site_name
#Load ggplot
library(ggplot2)
#Make plot
ggplot() +
geom_point(data = Data, aes(x = site_order, y = Chla_percent), size = 5, color = "blue") +
ylab ("Chlorophyll a (% difference from Poor threshold)") + xlab("") +
facet_grid(~Watershed, scale = "free", space = "free") +
scale_y_reverse() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, color = "black"),
axis.text.y = element_text(color = "black"),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
axis.line.x = element_line(color = "black"),
axis.line.y = element_line(color = "black"),
panel.background = element_rect(fill = "white"),
legend.key=element_blank(),
legend.title = element_blank(),
text = element_text(size=18),
panel.spacing = unit(2, "lines"))
#+scale_x_discrete(labels = Data$site_name)
这是图 1:
这是图 2:
重新排列这些类别的最简单方法是重新排列因子 site_name。这是一个最小的工作示例,后面是适用于您的示例的代码:
library(ggplot2)
library(dplyr)
myData <- iris %>% group_by(Species) %>% summarise(MeanSL =mean(Sepal.Length))
typeof(myData$Species)
ggplot(data=myData,aes(x=Species, y=MeanSL)) + geom_point()
myData$Species<- factor(myData$Species, levels=myData$Species[order(- myData$MeanSL)], ordered=TRUE)
ggplot(data=myData,aes(x=Species, y=MeanSL)) + geom_point()
在你的情况下,这应该可以解决问题:
Data$site_name <-factor(Data$site_name, levels=Data$site_name[order(- Data$Chla_percent)], ordered=TRUE)
ggplot() +
geom_point(data = Data, aes(x = site_name, y = Chla_percent), size = 5, color = "blue") +
ylab ("Chlorophyll a (% difference from Poor threshold)") + xlab("") +
facet_grid(~Watershed, scale = "free", space = "free") +
scale_y_reverse() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, color = "black"),
axis.text.y = element_text(color = "black"),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
axis.line.x = element_line(color = "black"),
axis.line.y = element_line(color = "black"),
panel.background = element_rect(fill = "white"),
legend.key=element_blank(),
legend.title = element_blank(),
text = element_text(size=18),
panel.spacing = unit(2, "lines"))