[英]How to reorder bars in the chart and the legend
我正在努力按照数据结构(SD、MB、FI、FO、NP)重新排序图中的条形和图例。 这是我的数据;
Data <- tibble::tribble(
~Year, ~SD, ~MB, ~FI, ~FO, ~NP,
"2010", 41, 36.7, 10.2, 5.3, 6.8,
"2011", 49.1, 50.9, NA, NA, NA,
"2012", 41.1, 32.4, 11.4, 8.6, 6.4,
"2013", 38.9, 29.6, 10, 13.7, 7.7,
"2014", 38.8, 36.5, 5.2, 10.4, 9,
"2015", 43.4, 39.1, NA, 11.9, 5.5,
"2016", 40.6, 38, 10.5, 8.8, 2.2,
"2017", 38.3, 42.3, 9.7, 6.8, 2.9,
"2018", 37.8, 40.3, 9.3, 10.6, 2,
"2019", 33.8, 41.6, 8.1, 14.2, 2.3
)
编码;
Data %>%
pivot_longer(-Year) %>%
ggplot(aes(x = Year, y = value, fill = name, reorder(TRUE))) + ylab("Students") +
xlab("Year") +
geom_bar(stat = "identity", position = "dodge") +
facet_wrap(~ Year, scales = 'free_x', ncol = 10, strip.position = "bottom") +
theme_minimal() +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank()+
theme(strip.placement = "outside",
panel.spacing = unit(0, "points"),
axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
strip.background = element_blank(),
strip.background.y = element_blank(),
panel.background = element_rect(fill = "white"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
strip.text = element_text(face = "bold", size = 9)) +
scale_fill_continuous(name = "Legend", label = c("SD","MB","FI","FO","NP", ordered(TRUE))) +
theme(legend.position = "right", axis.text.x = element_text(angle = 90,vjust = 0.4)))
先感谢您。
这是对代码的编辑:
csv 文件在这里: https ://1drv.ms/x/s!AjskoWp__th-kEJOld80Tb0Bxx-C?e =JoSmGf
Rtutorial <- read.csv("C:Desktop/statistics/Rtutorial.csv", header=TRUE)
Rtutorial<-as.data.frame(Rtutorial)
library(ggplot2)
library(tidyr)
library(dplyr)
Rtutorial %>%
pivot_longer(c(-Year, -Total))) %>%
mutate(name = factor(name, levels=c('Total',
'Sable-Antelope',
'Monkey',
'Frogs and reed buck',
'Fox and jackals',
'Side striped jackal'
))) %>%
ggplot(aes(x=as.factor(Year), y=value, fill=name, reorder(TRUE))) +
scale_y_continuous(labels = scales::comma_format()) +
ylab("Total Population") +
xlab("Year") +
labs(fill="Legend") +
geom_bar(stat = "identity", position = "dodge") +
theme_classic() +
theme(strip.placement = "outside",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank() ,
legend.position = "right",
axis.text.x = element_text(angle = 0, vjust = 0)) +
scale_fill_brewer(palette = "Greens", name = "Legend", label=c('Total
Population','Sable-Antelope','Monkey','Frogs and reed buck','Fox and
jackals','Side striped jackal', ordered(T)) +
theme(legend.position = "right", axis.text.x = element_text(angle =
90,vjust = 0.4)))
我在运行代码时仍然出现错误,我尝试查看stackoverflow上的几个示例,但看不出问题出在哪里。
我得到的错误之一是因子错误 - 名称。
如果你把这一行:
mutate(name = factor(name, levels=c("SD","MB","FI","FO","NP"))) %>%
在您的pivot_longer(-Year)
函数之后,它应该可以工作。 这将使变量name
成为一个因子,并根据需要排序级别。
Data %>%
pivot_longer(-Year) %>%
mutate(name = factor(name, levels=c("SD","MB","FI","FO","NP"))) %>%
ggplot(aes(x = Year, y = value, fill = name, reorder(TRUE))) + ylab("Students") +
xlab("Year") +
geom_bar(stat = "identity", position = "dodge") +
facet_wrap(~ Year, scales = 'free_x', ncol = 10, strip.position = "bottom") +
theme_minimal() +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank()+
theme(strip.placement = "outside",
panel.spacing = unit(0, "points"),
axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
strip.background = element_blank(),
strip.background.y = element_blank(),
panel.background = element_rect(fill = "white"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
strip.text = element_text(face = "bold", size = 9)) +
scale_fill_continuous(name = "Legend", label = c("SD","MB","FI","FO","NP", ordered(TRUE))) +
theme(legend.position = "right", axis.text.x = element_text(angle = 90,vjust = 0.4)))
编辑- 在下面回答评论。
您可以稍微简化该功能,如下所示:
Data <- tibble::tribble(
~Year, ~`Sable-Antelope`, ~`Monkey`, ~`Frogs and reed buck`, ~`Fox and jackals`, ~`Side striped jackal`,
"2010", 41, 36.7, 10.2, 5.3, 6.8,
"2011", 49.1, 50.9, NA, NA, NA,
"2012", 41.1, 32.4, 11.4, 8.6, 6.4,
"2013", 38.9, 29.6, 10, 13.7, 7.7,
"2014", 38.8, 36.5, 5.2, 10.4, 9,
"2015", 43.4, 39.1, NA, 11.9, 5.5,
"2016", 40.6, 38, 10.5, 8.8, 2.2,
"2017", 38.3, 42.3, 9.7, 6.8, 2.9,
"2018", 37.8, 40.3, 9.3, 10.6, 2,
"2019", 33.8, 41.6, 8.1, 14.2, 2.3)
Data %>%
pivot_longer(-Year) %>%
mutate(name = factor(name, levels=c("Sable-Antelope",
"Monkey",
"Frogs and reed buck",
"Fox and jackals",
"Side striped jackal"))) %>%
ggplot(aes(x = Year, y = value, fill = name)) +
ylab("Students") +
xlab("Year") +
labs(fill="Legend") +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_brewer(palette="Greens") +
theme_minimal() +
theme(
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank() ,
legend.position = "right",
axis.text.x = element_text(angle = 0, vjust = 7.5))```
编辑 2 - 使用更新的数据和语法。
有几件事会阻止您的代码运行。
Total
组,因此您不应在pivot_longer()
函数中将其pivot_longer()
。pivot_longer()
的末尾有一个额外的括号read.csv()
空格时,将替换为句点,因此您指定的级别将不起作用。 您必须将级别指定为带句点的名称,将标签指定为带空格而不是句点的名称。theme()
调用覆盖了第一个theme()
调用中的内容。 这些可以结合起来。下面的代码解决了这些问题。
Rtutorial %>%
pivot_longer(c(-Year)) %>%
mutate(name = factor(name, levels=c('Total',
'Sable.Antelope',
'Monkey',
'Frogs.and.reed.buck',
'Fox.and.jackals',
'Side.striped.jackal'),
labels=c('Total',
'Sable-Antelope',
'Monkey',
'Frogs and reed buck',
'Fox and jackals',
'Side striped jackal'))) %>%
ggplot(aes(x=as.factor(Year), y=value, fill=name, reorder(TRUE))) +
scale_y_continuous(labels = scales::comma_format()) +
ylab("Total Population") +
xlab("Year") +
labs(fill="Legend") +
geom_bar(stat = "identity", position = "dodge") +
theme_classic() +
theme(strip.placement = "outside",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank() ,
legend.position = "right",
axis.text.x = element_text(angle = 90,vjust = 0.4)) +
scale_fill_brewer(palette = "Greens", name = "Legend")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.