R 将ggplot椭圆压缩为真实/可能值
使用ggplot打印椭圆时,是否可以将椭圆约束为实际可能的值 例如,以下可复制代码和数据绘制了两种物种的Ele与Var。Var是一个正变量,不能为负。尽管如此,负值仍包含在生成的省略号中。是否可以在x轴上将椭圆绑定为0(使用ggplot) 更具体地说,我画的是一条平边,椭圆体在x轴上被截断为0R 将ggplot椭圆压缩为真实/可能值,r,ggplot2,ggproto,R,Ggplot2,Ggproto,使用ggplot打印椭圆时,是否可以将椭圆约束为实际可能的值 例如,以下可复制代码和数据绘制了两种物种的Ele与Var。Var是一个正变量,不能为负。尽管如此,负值仍包含在生成的省略号中。是否可以在x轴上将椭圆绑定为0(使用ggplot) 更具体地说,我画的是一条平边,椭圆体在x轴上被截断为0 library(ggplot2) set.seed(123) df <- data.frame(Species = rep(c("BHS", "MTG"), each = 100),
library(ggplot2)
set.seed(123)
df <- data.frame(Species = rep(c("BHS", "MTG"), each = 100),
Ele = c(sample(1500:3000, 100), sample(2500:3500, 100)),
Var = abs(rnorm(200)))
ggplot(df, aes(Var, Ele, color = Species)) +
geom_point() +
stat_ellipse(aes(fill = Species), geom="polygon",level=0.95,alpha=0.2)
库(ggplot2)
种子集(123)
df您可以编辑默认状态,将点剪裁为特定值。在这里,我们将基本状态更改为将x值从0修剪为0
StatClipEllipse <- ggproto("StatClipEllipse", Stat,
required_aes = c("x", "y"),
compute_group = function(data, scales, type = "t", level = 0.95,
segments = 51, na.rm = FALSE) {
xx <- ggplot2:::calculate_ellipse(data = data, vars = c("x", "y"), type = type,
level = level, segments = segments)
xx %>% mutate(x=pmax(x, 0))
}
)
然后你可以用它来制作你的情节
ggplot(df, aes(Var, Ele, color = Species)) +
geom_point() +
stat_clip_ellipse(aes(fill = Species), geom="polygon",level=0.95,alpha=0.2)
这是受。的启发,您可以编辑默认状态以将点剪裁为特定值。在这里,我们将基本状态更改为将x值从0修剪为0
StatClipEllipse <- ggproto("StatClipEllipse", Stat,
required_aes = c("x", "y"),
compute_group = function(data, scales, type = "t", level = 0.95,
segments = 51, na.rm = FALSE) {
xx <- ggplot2:::calculate_ellipse(data = data, vars = c("x", "y"), type = type,
level = level, segments = segments)
xx %>% mutate(x=pmax(x, 0))
}
)
然后你可以用它来制作你的情节
ggplot(df, aes(Var, Ele, color = Species)) +
geom_point() +
stat_clip_ellipse(aes(fill = Species), geom="polygon",level=0.95,alpha=0.2)
这是受.启发的。基于我上面的评论,我创建了一个不那么误导人的可视化选项。这忽略了y
均匀分布的问题,因为与严重倾斜的x
变量相比,这是一个不太严重的问题
这两个选项都使用,这是ggplot2
的扩展,但为了以防万一,我还包括了我使用的特定函数的源代码
library(ggforce)
library(scales)
# power_trans <- function (n)
# {
# scales::trans_new(name = paste0("power of ", fractions(n)), transform = function(x) {
# x^n
# }, inverse = function(x) {
# x^(1/n)
# }, breaks = scales::extended_breaks(), format = scales::format_format(),
# domain = c(0, Inf))
# }
此选项沿平方根变换拉伸x轴,将聚集在零附近的点展开。然后在这个新空间上计算一个椭圆
- 优点:看起来仍然像一个椭圆李>
- 缺点:为了让它更好地发挥作用并在x轴上标记
Var=0
点,您必须使用expand=c(0,0)
,这将精确地剪裁限制,因此需要更多地修改手动限制/中断/标签,包括选择一个非常小的值(0.0001)表示为0
- 缺点:x值不是沿轴线性分布的,这在阅读图形时需要更多的认知负荷
备选案文2:
ggplot(df, aes(sqrt(Var), Ele, color = Species)) +
geom_point() +
stat_ellipse() +
coord_trans(x = ggforce::power_trans(2)) +
scale_x_continuous(breaks = sqrt(0:4), labels = 0:4,
name = "Var")
此选项绘制预转换的sqrt(Var)
(请注意aes(…)
)。然后根据这个新的近似法线值计算椭圆。然后它拉伸x轴,使Var
的值再次以线性间隔排列,从而在相同的变换中扭曲椭圆
- 优点:看起来很酷
- 优点:Var值在x轴上易于解释
- 优点:你可以很容易地看到Var=0附近的密度和“鸡蛋”的宽平端
- 优点:尖端显示这些值的密度有多低
- 缺点:看起来不熟悉,需要解释和额外的认知负荷来解释
基于我上面的评论,我为可视化创建了一个误导性较小的选项。这忽略了y
均匀分布的问题,因为与严重倾斜的x
变量相比,这是一个不太严重的问题
这两个选项都使用,这是ggplot2
的扩展,但为了以防万一,我还包括了我使用的特定函数的源代码
library(ggforce)
library(scales)
# power_trans <- function (n)
# {
# scales::trans_new(name = paste0("power of ", fractions(n)), transform = function(x) {
# x^n
# }, inverse = function(x) {
# x^(1/n)
# }, breaks = scales::extended_breaks(), format = scales::format_format(),
# domain = c(0, Inf))
# }
此选项沿平方根变换拉伸x轴,将聚集在零附近的点展开。然后在这个新空间上计算一个椭圆
- 优点:看起来仍然像一个椭圆李>
- 缺点:为了让它更好地发挥作用并在x轴上标记
Var=0
点,您必须使用expand=c(0,0)
,这将精确地剪裁限制,因此需要更多地修改手动限制/中断/标签,包括选择一个非常小的值(0.0001)表示为0
- 缺点:x值不是沿轴线性分布的,这在阅读图形时需要更多的认知负荷
备选案文2:
ggplot(df, aes(sqrt(Var), Ele, color = Species)) +
geom_point() +
stat_ellipse() +
coord_trans(x = ggforce::power_trans(2)) +
scale_x_continuous(breaks = sqrt(0:4), labels = 0:4,
name = "Var")
此选项绘制预转换的sqrt(Var)
(请注意aes(…)
)。然后根据这个新的近似法线值计算椭圆。然后它拉伸x轴,使Var
的值再次以线性间隔排列,从而在相同的变换中扭曲椭圆
- 优点:看起来很酷
- 优点:Var值在x轴上易于解释
- 优点:你可以很容易地看到Var=0附近的密度和“鸡蛋”的宽平端
- 优点:尖端显示这些值的密度有多低
- 缺点:看起来不熟悉,需要解释和额外的认知负荷来解释
假设您的数据基本上一直到0,您是否在想象一个带平边的椭圆?或者将椭圆向右移动,即使它们将错过0附近的点?最简单的可能是使用对数变换的x轴和对数刻度上的椭圆。。。我想真正的问题是“椭圆的用途是什么”?我正在画一个平边,这样椭球在0处被截断。我正在使用椭圆来描述每个物种的Ele
和Var
观测值的分布。我认为上面的图做得很好,但是如果椭圆只包含每个变量的可能组合就更好了(依我看)。我认为@Gregor关于需要转换的观点是正确的。这些椭圆不能很好地显示分布。如果真实数据类似于模拟中的折叠法线,那么对数变换或sqrt变换在理论上合理吗?您模拟的y变量是均匀分布的,因此椭圆也暗示了其他内容。椭圆实际上只适用于多元t或范数