gpt4 book ai didi

r - 在 geom_violin 中躲闪失败有解决方法吗?

转载 作者:行者123 更新时间:2023-12-04 04:18:50 27 4
gpt4 key购买 nike

如果数据集每个单元格至少包含三个数据点,则 fiddle 的躲避会按预期工作。请参见下图。

道奇如期而至 Dodge is as expeced

但是,在随后的代码中,“Verbal Class B”单元格中只有 2 个数据点。只有两个数据点,ggplot2 拒绝构建 fiddle ,我同意。但作为副作用,“Verbal Class A”条件下的 fiddle 水平未对齐,导致 fiddle 也与 geom_point 生成的数据点未对齐。请参见下图。

Violin 闪避失败并导致与其他闪避元素错位

是否有解决方法可以使 fiddle 正确闪避以与数据点保持对齐?

Score = c( 9,12,6,12,11,10,4,12,11,10,9,9,14,8,12,11,10,11,4,10,11,17,6,15,8,12,14,1,16,3,18,16,15,11,10,14,8,8,12,15)
Topic = c( "Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Math","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal","Verbal")
Class = c( "A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B")
#Class = c( "A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B")
DataSet = data.frame(Topic,Class,Score)
mywidth <- 1.0
mydodge <- 0.90
myjitteramount <- 0.35
ggplot (data = DataSet, aes(x = Topic, y = Score, color = Class))+
geom_violin (draw_quantiles = c(0.25, 0.5, 0.75), fill = NA, width = mywidth, position = position_dodge(mydodge), alpha = 1.0, size = 0.47, scale = "area", show.legend = FALSE) +
geom_point (position = position_jitterdodge(dodge.width = mydodge, jitter.height = 0, jitter.width = myjitteramount), shape = 21, size = 1.5, stroke = 0.7, fill = NA, alpha = 1.0, show.legend = TRUE) +
ggsave ("TempPlot1.png", width = 11, height = 11, units = "in", dpi = 600)

最佳答案

我觉得这可能不太容易实现 - 当然,如果有一些糟糕的黑客攻击,它就会成为可能。

如果你想保持闪避,一个不太令人满意的解决方法是用一组不同的数据创建 fiddle 图(给最后一组假数据),用一个矩形覆盖它,然后用你的点叠加.

library(ggplot2)

Score <- c(9, 12, 6, 12, 11, 10, 4, 12, 11, 10, 9, 9, 14, 8, 12, 11, 10, 11, 4, 10, 11, 17, 6, 15, 8, 12, 14, 1, 16, 3, 18, 16, 15, 11, 10, 14, 8, 8, 12, 15)
Topic <- c("Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Math", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal", "Verbal")
Class1 <- c( "A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B")
Class2 <- c( "A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B")

DataSet1 <- data.frame(Topic, Class1, Score)
DataSet2 <- data.frame(Topic, Class2, Score)

ggplot() +
geom_violin(data = DataSet1, aes(x = Topic, y = Score, color = Class1), draw_quantiles = c(0.25, 0.5, 0.75), position = position_dodge()) +
annotate(geom = 'rect', xmin = 2, xmax = Inf, ymin = -Inf, ymax = Inf, fill = 'white') +
geom_point(data = DataSet2, aes(x = Topic, y = Score, color = Class2), position = position_jitterdodge())

enter image description here

更好的选择可能是使用 facet 分隔数据。你只能真正按类分面,这可能会使比较变得困难,但至少数据点与 fiddle 重叠:

ggplot(data = DataSet2, aes(x = Topic, y = Score, color = Class2)) +
geom_violin(draw_quantiles = c(0.25, 0.5, 0.75), position = position_dodge()) +
geom_point(position = position_jitterdodge()) +
facet_grid(~Class2, scales = 'free_x')

enter image description here

另一种选择是重新考虑您的可视化效果,例如使用 ggbeeswarm。

library(ggbeeswarm)
ggplot(DataSet2, aes(x = Topic, y = Score, color = Class2)) +
geom_beeswarm(dodge.width = 0.5)

enter image description here

关于r - 在 geom_violin 中躲闪失败有解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59960048/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com