我正在使用R附带的'钻石'数据集.当试图根据价格中位数对"颜色"因素进行排序时,它将无效.
这就是我得到的:
ggplot(diamonds, aes(x = reorder(color, -price, FUN=median), y = price)) +
geom_boxplot() +
facet_wrap(~cut) +
ylim(0, 5500)
Run Code Online (Sandbox Code Playgroud)
有什么我做错了或错过了吗?
这是使用此处提供的两个辅助函数实现所请求的排列的相对简单的方法
reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
new_x <- paste(x, within, sep = sep)
stats::reorder(new_x, by, FUN = fun)
}
scale_x_reordered <- function(..., sep = "___") {
reg <- paste0(sep, ".+$")
ggplot2::scale_x_discrete(labels = function(x) gsub(reg, "", x), ...)
}
library(tidyverse)
data(diamonds)
p <- ggplot(diamonds, aes(x = reorder_within(color, price, cut, median), y = price)) +
geom_boxplot(width = 5) +
scale_x_reordered()+
facet_wrap(~cut, scales = "free_x")
Run Code Online (Sandbox Code Playgroud)
使用ylim(0, 5500)将删除大部分数据导致不同的箱形图,这将干扰任何以前定义的订单.如果您希望限制轴而不这样做,最好使用:
p + coord_cartesian(ylim = c(0, 5500))
Run Code Online (Sandbox Code Playgroud)
这导致:
如果您真的打算删除大部分数据并保留排列,请在绘图之前过滤数据:
diamonds %>%
filter(price < 5500) %>%
ggplot(aes(x = reorder_within(color, price, cut, median), y = price)) +
geom_boxplot(width = 5) +
scale_x_reordered()+
facet_wrap(~cut, scales = "free_x")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |