如何在保持 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"))