ggplot2,第 1 列的标签但第 2 列的值是自动实现的而不是手动实现的?

ggplot2, labels from column 1 but values from column 2 implemented automatically rather than by hand?

问题看起来很简单。我在数据框中有三列数据。第一行是分数,第二行是排名,第三行是相应的名称。我想在 ggplot2 中创建一个图表,按排名对分数进行排序。

问题是我不希望 x 标签是排名,而是个人姓名。另一个问题是我无法手动完成此操作(这很容易)。

数据集的示例如下所示

    var1 <- c("jon", "jamie", "jessie", "jennifer", "jordan") 
    var2 <- c(91, 92, 85, 99, 88)
    var3 <- c(3,2,5,1,4)
    data <- data.frame(var1, var2, var3)

我目前一直在尝试使用标签,但效果不是很好。核心问题是 ggplot2 如何排序。

ggplot(data, aes(x = var3, y = var2)) +
geom_bar(stat="identity") + 
scale_x_discrete(name ="Name", labels = (data$var3 = data$var1))

目前标签是排名。我希望他们是名字。

姓名顺序应为 jennifer、jamie、jon、jordan 和 jessie。相反,我只得到行的名称顺序,即 jon、jamie、jessie、jennifer、jordan。

这可能不够优雅 - 同时使用 order()reorder() 对我来说感觉很笨重 - 但它可以通过对原始脚本进行有限的更改来完成工作。

设置:

library(tidyverse)

var1 <- c('jon', 'jamie', 'jessie', 'jennifer', 'jordan') 
var2 <- c(91, 92, 85, 99, 88)
data <- data.frame(var1, var2)

重新排序 var1 的级别:

levels(data[,'var1'])
data[,'var1'] <- reorder(data[,'var1'], -data[,'var2'])
levels(data[,'var1'])

给予:

> levels(data[,'var1'])
[1] "jamie"    "jennifer" "jessie"   "jon"      "jordan"  
> data[,'var1'] <- reorder(data[,'var1'], -data[,'var2'])
> levels(data[,'var1'])
[1] "jennifer" "jamie"    "jon"      "jordan"   "jessie"  

我们可以根据需要绘制:

ggplot(data) +
  geom_bar(aes(x = var1, y = var2), stat = 'identity') + 
  scale_x_discrete(name = 'Name', labels = levels(data[,'var1']))

对我来说,这样总是效果更好:

library(ggplot2)
library(dplyr)

dat %>%
  arrange(ranks) %>%
  mutate(names = factor(ranks, , names, T), ranks = NULL) %>%
  ggplot(aes(x = names, y = marks)) +
  geom_col(fill = 'salmon', alpha = .5) + 
  ggthemes::theme_tufte()

dat <- data.frame(
  names  = c("jon", "jamie", "jessie", "jennifer", "jordan"),
  marks  = c(91, 92, 85, 99, 88),
  ranks  = c(3, 2, 5, 1, 4)
)