Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将ggplot椭圆压缩为真实/可能值_R_Ggplot2_Ggproto - Fatal编程技术网

R 将ggplot椭圆压缩为真实/可能值

R 将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),

使用ggplot打印椭圆时,是否可以将椭圆约束为实际可能的值

例如,以下可复制代码和数据绘制了两种物种的Ele与Var。Var是一个正变量,不能为负。尽管如此,负值仍包含在生成的省略号中。是否可以在x轴上将椭圆绑定为0(使用ggplot)

更具体地说,我画的是一条平边,椭圆体在x轴上被截断为0

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或范数