自定义 R 箱线图
Customize R Box-Plot
我想画一些箱线图,显示我的数据的中位数。与常规箱线图相比,我想将框扩展到我的数据的最小值和最大值而不是四分位数。
示例:
x <- c(1,3,5,7,9)
x 的常规箱线图将具有以下统计数据:
- 1: 下胡须
- 3:框的下端
- 5:中位数
- 7:框的上端
- 9: 上胡须
我想得到:
- 1:框的下端
- 5:中位数
- 9:框的上端
谁能帮帮我?
在 ggplot
中,您可以通过在调用中设置它们来明确控制这些截止值。
ggplot() +
geom_boxplot(
aes(x = 1
, lower = min(x)
, middle = median(x)
, upper = max(x)
, ymin = min(x)
, ymax = max(x))
, stat = "identity"
)
如果您有多个组,您可能需要先分别计算这些点。在这里,使用 dplyr
iris %>%
group_by(Species) %>%
summarise(min = min(Petal.Length)
, max = max(Petal.Length)
, median = median(Petal.Length)
) %>%
ggplot() +
geom_boxplot(
aes(x = Species
, lower = min
, middle = median
, upper = max
, ymin = min
, ymax = max)
, stat = "identity"
)
如果您想添加一个 "legend",您可能需要做更多的调整。然而,使用 cowplot
可以相对容易地简单地创建一个以您喜欢的方式标记的图,然后将其用作图例。下面,我创建与上面相同的箱线图(但将其保存到一个变量)并创建一个新图作为图例(根据需要修改)。
basePlot <-
iris %>%
group_by(Species) %>%
summarise(min = min(Petal.Length)
, max = max(Petal.Length)
, median = median(Petal.Length)
) %>%
ggplot() +
geom_boxplot(
aes(x = Species
, lower = min
, middle = median
, upper = max
, ymin = min
, ymax = max)
, stat = "identity"
)
legendPlot <-
data.frame(lower = 1, middle = 2, upper = 3) %>%
ggplot(
aes(x = 1
, lower = lower
, middle = middle
, upper = upper
, ymin = lower
, ymax = middle
)
) +
# ggtitle("Legend") +
geom_boxplot(stat = "identity") +
scale_y_continuous(
name = ""
, breaks = 1:3
, labels = c("Minimum", "Median", "Maximum")
) +
scale_x_continuous("Legend", position = "top") +
theme(axis.text.x = element_blank()
, axis.title.x = element_text(face = "bold"))
然后,加载 cowplot
(请注意,我正在重置主题,因为 cowplot
会自动加载它自己的主题,我不关心它)并使用 plot_grid
创建布局.请注意,我在这里创建了两个单独的列,以使图例更小并垂直居中。如果要调整细节,可以使用 rel_widths
和 rel_heights
。 (scale
也是一个选项,但我不喜欢它与 rel_widths
一起使用的方式。)
library(cowplot)
theme_set(theme_minimal())
plot_grid(
basePlot
, plot_grid(
ggplot()
, legendPlot
, ggplot()
, ncol = 1
)
, rel_widths = c(1, 0.33)
)
给予
我想画一些箱线图,显示我的数据的中位数。与常规箱线图相比,我想将框扩展到我的数据的最小值和最大值而不是四分位数。 示例:
x <- c(1,3,5,7,9)
x 的常规箱线图将具有以下统计数据:
- 1: 下胡须
- 3:框的下端
- 5:中位数
- 7:框的上端
- 9: 上胡须
我想得到:
- 1:框的下端
- 5:中位数
- 9:框的上端
谁能帮帮我?
在 ggplot
中,您可以通过在调用中设置它们来明确控制这些截止值。
ggplot() +
geom_boxplot(
aes(x = 1
, lower = min(x)
, middle = median(x)
, upper = max(x)
, ymin = min(x)
, ymax = max(x))
, stat = "identity"
)
如果您有多个组,您可能需要先分别计算这些点。在这里,使用 dplyr
iris %>%
group_by(Species) %>%
summarise(min = min(Petal.Length)
, max = max(Petal.Length)
, median = median(Petal.Length)
) %>%
ggplot() +
geom_boxplot(
aes(x = Species
, lower = min
, middle = median
, upper = max
, ymin = min
, ymax = max)
, stat = "identity"
)
如果您想添加一个 "legend",您可能需要做更多的调整。然而,使用 cowplot
可以相对容易地简单地创建一个以您喜欢的方式标记的图,然后将其用作图例。下面,我创建与上面相同的箱线图(但将其保存到一个变量)并创建一个新图作为图例(根据需要修改)。
basePlot <-
iris %>%
group_by(Species) %>%
summarise(min = min(Petal.Length)
, max = max(Petal.Length)
, median = median(Petal.Length)
) %>%
ggplot() +
geom_boxplot(
aes(x = Species
, lower = min
, middle = median
, upper = max
, ymin = min
, ymax = max)
, stat = "identity"
)
legendPlot <-
data.frame(lower = 1, middle = 2, upper = 3) %>%
ggplot(
aes(x = 1
, lower = lower
, middle = middle
, upper = upper
, ymin = lower
, ymax = middle
)
) +
# ggtitle("Legend") +
geom_boxplot(stat = "identity") +
scale_y_continuous(
name = ""
, breaks = 1:3
, labels = c("Minimum", "Median", "Maximum")
) +
scale_x_continuous("Legend", position = "top") +
theme(axis.text.x = element_blank()
, axis.title.x = element_text(face = "bold"))
然后,加载 cowplot
(请注意,我正在重置主题,因为 cowplot
会自动加载它自己的主题,我不关心它)并使用 plot_grid
创建布局.请注意,我在这里创建了两个单独的列,以使图例更小并垂直居中。如果要调整细节,可以使用 rel_widths
和 rel_heights
。 (scale
也是一个选项,但我不喜欢它与 rel_widths
一起使用的方式。)
library(cowplot)
theme_set(theme_minimal())
plot_grid(
basePlot
, plot_grid(
ggplot()
, legendPlot
, ggplot()
, ncol = 1
)
, rel_widths = c(1, 0.33)
)
给予