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)
)
问题看起来很简单。我在数据框中有三列数据。第一行是分数,第二行是排名,第三行是相应的名称。我想在 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)
)