- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 R 中生成分组 fiddle 图的变体(最好使用ggplot2
),类似于下面的:
它是由以下可重现的示例代码生成的:
# Load libraries #
library(tidyverse)
# Create dummy data #
set.seed(321)
df <- data.frame(X = rep(c("X1", "X2"), each = 100),
Y = rgamma(n = 200, shape = 2, rate = 2),
Z = rep(c("Za", "Zb"), rep = 100),
stringsAsFactors = FALSE)
# Grouped violin plot #
df %>%
ggplot(., aes(x = X, y = Y, fill = Z)) +
geom_violin(draw_quantiles = 0.5) +
scale_fill_manual(values = c("Za" = "red", "Zb" = "blue"))
我想要的变化是中位数以上的密度与中位数以下的密度相比应具有不同的阴影,如下图所示:
我使用以下代码为数据中的组合 X = X1
和 Z = Za
生成了上述(单个) fiddle 图:
## Shaded violin plot ##
# Calculate limits and median #
df.lim <- df %>%
filter(X == "X1", Z == "Za") %>%
summarise(Y_min = min(Y),
Y_qnt = quantile(Y, 0.5),
Y_max = max(Y))
# Calculate density, truncate at limits and assign shade category #
df.dens <- df %>%
filter(X == "X1", Z == "Za") %>%
do(data.frame(LOC = density(.$Y)$x,
DENS = density(.$Y)$y)) %>%
filter(LOC >= df.lim$Y_min, LOC <= df.lim$Y_max) %>%
mutate(COL = ifelse(LOC > df.lim$Y_qnt, "Empty", "Filled"))
# Find density values at limits #
df.lim.2 <- df.dens %>%
filter(LOC == min(LOC) | LOC == max(LOC))
# Produce shaded single violin plot #
df.dens %>%
ggplot(aes(x = LOC)) +
geom_area(aes(y = DENS, alpha = COL), fill = "red") +
geom_area(aes(y = -DENS, alpha = COL), fill = "red") +
geom_path(aes(y = DENS)) +
geom_path(aes(y = -DENS)) +
geom_segment(data = df.lim.2, aes(x = LOC, y = DENS, xend = LOC, yend = -DENS)) +
coord_flip() +
scale_alpha_manual(values = c("Empty" = 0.1, "Filled" = 1))
正如您在代码中注意到的那样,我使用水平密度函数从头开始构建 fiddle 图,然后翻转轴。当我尝试生成分组 fiddle 图时出现问题,主要是因为将出现组 X
和 Z
的轴已用作 fiddle 的“高度”密度。我确实尝试通过按组重复所有计算来达到相同的结果,但我陷入了最后一步:
## Shaded grouped violin plot ##
# Calculate limits and median by group #
df.lim <- df %>%
group_by(X, Z) %>%
summarise(Y_min = min(Y),
Y_qnt = quantile(Y, 0.5),
Y_max = max(Y))
# Calculate density, truncate at limits and assign shade category by group #
df.dens <- df %>%
group_by(X, Z) %>%
do(data.frame(LOC = density(.$Y)$x,
DENS = density(.$Y)$y)) %>%
left_join(., df.lim, by = c("X", "Z")) %>%
filter(LOC >= Y_min, LOC <= Y_max) %>%
mutate(COL = ifelse(LOC > Y_qnt, "Empty", "Filled"))
# Find density values at limits by group #
df.lim.2 <- df.dens %>%
group_by(X, Z) %>%
filter(LOC == min(LOC) | LOC == max(LOC))
# Produce shaded grouped violin plot #
df.dens %>%
ggplot(aes(x = LOC, group = interaction(X, Z))) +
# The following two lines don't work when included #
#geom_area(aes(y = DENS, alpha = COL), fill = "red") +
#geom_area(aes(y = -DENS, alpha = COL), fill = "red") +
geom_path(aes(y = DENS)) +
geom_path(aes(y = -DENS)) +
geom_segment(data = df.lim.2, aes(x = LOC, y = DENS, xend = LOC, yend = -DENS)) +
coord_flip() +
scale_alpha_manual(values = c("Empty" = 0.1, "Filled" = 1))
运行上面的代码将为每个组生成 fiddle 图的轮廓,每个组都在另一个之上。但是,一旦我尝试包含 geom_area
行,代码就会失败。
我的直觉告诉我,我需要以某种方式生成“阴影” fiddle 图作为新的geom
,然后可以在ggplot2
的一般结构下使用图形,但我不知道如何做到这一点,因为我的编码技能还没有延伸到那么远。任何帮助或指示,无论是沿着我的思路还是在不同的方向,将不胜感激。感谢您抽出时间。
最佳答案
想法
为了好玩,我快速编写了一个半 fiddle 几何图形。它基本上是从 GeomViolin
进行大量复制和粘贴,为了使其运行,我必须访问一些内部 ggplot2
函数,这些函数不会通过 导出>:::
这意味着该解决方案将来可能无法运行(如果 ggplot
团队决定更改其内部功能)。
但是,此解决方案有效,您可以指定上部和下部的 alpha 级别。 geom
假设您只提供一个分位数。该代码仅进行了表面测试,但它让您了解如何完成此操作。如前所述,它在很大程度上是来自 GeomViolin
的简单复制和粘贴,其中我添加了一些代码,找出哪些值低于和高于分位数,并将底层的 GeomPolygon
分割为2 部分,因为该函数仅使用单个 alpha 值。它同样适用于groups
和coord_flip
。
代码
library(grid)
GeomHalfViolin <- ggproto("GeomHalfViolin", GeomViolin,
draw_group = function (self, data, ..., draw_quantiles = NULL,
alpha_upper = .5, alpha_lower = 1) {
data <- transform(data, xminv = x - violinwidth * (x - xmin),
xmaxv = x + violinwidth * (xmax - x))
newdata <- rbind(transform(data, x = xminv)[order(data$y),
], transform(data, x = xmaxv)[order(data$y, decreasing = TRUE),
])
newdata <- rbind(newdata, newdata[1, ])
if (length(draw_quantiles) > 0 & !scales::zero_range(range(data$y))) {
stopifnot(all(draw_quantiles >= 0), all(draw_quantiles <=
1))
stopifnot(length(draw_quantiles) <= 1)
## need to add ggplot::: to access ggplot2 internal functions here and there
quantiles <- ggplot2:::create_quantile_segment_frame(data, draw_quantiles)
###------------------------------------------------
## find out where the quantile is supposed to be
quantile_line <- unique(quantiles$y)
## which y values are below this quantile?
ind <- newdata$y <= quantile_line
## set the alpha values accordingly
newdata$alpha[!ind] <- alpha_upper
newdata$alpha[ind] <- alpha_lower
###------------------------------------------------
aesthetics <- data[rep(1, nrow(quantiles)), setdiff(names(data),
c("x", "y", "group")), drop = FALSE]
aesthetics$alpha <- rep(1, nrow(quantiles))
both <- cbind(quantiles, aesthetics)
both <- both[!is.na(both$group), , drop = FALSE]
quantile_grob <- if (nrow(both) == 0) {
zeroGrob()
}
else {
GeomPath$draw_panel(both, ...)
}
###------------------------------------------------
## GeomPolygon uses a single alpha value by default
## Hence, split the violin in two parts
ggplot2:::ggname("geom_half_violin",
grobTree(GeomPolygon$draw_panel(newdata[ind, ], ...),
GeomPolygon$draw_panel(newdata[!ind, ], ...),
quantile_grob))
###------------------------------------------------
}
else {
ggplot2:::ggname("geom_half_violin", GeomPolygon$draw_panel(newdata,
...))
}
}
)
geom_half_violin <- function(mapping = NULL, data = NULL, stat = "ydensity",
position = "dodge", ..., draw_quantiles = NULL,
alpha_upper = .5, alpha_lower = 1,
trim = TRUE, scale = "area",
na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) {
layer(data = data, mapping = mapping, stat = stat, geom = GeomHalfViolin,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(trim = trim, scale = scale, draw_quantiles = draw_quantiles,
alpha_lower = alpha_lower, alpha_upper = alpha_upper,
na.rm = na.rm, ...))
}
library(tidyverse)
# Create dummy data #
set.seed(321)
df <- data.frame(X = rep(c("X1", "X2"), each = 100),
Y = rgamma(n = 200, shape = 2, rate = 2),
Z = rep(c("Za", "Zb"), rep = 100),
stringsAsFactors = FALSE)
# Grouped violin plot #
df %>%
ggplot(., aes(x = X, y = Y, fill = Z)) +
geom_half_violin(draw_quantiles = 0.5, alpha_upper = .1) +
scale_fill_manual(values = c("Za" = "red", "Zb" = "blue"))
# no groups
df %>% filter(Z == "Za") %>%
ggplot(., aes(x = X, y = Y)) +
geom_half_violin(draw_quantiles = 0.5, alpha_upper = .1, fill = "red") +
scale_fill_manual(values = c("Za" = "red", "Zb" = "blue")) +
coord_flip()
<小时/>
图表
关于r - 按组划分的阴影 fiddle 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57388323/
我有几个组的测量值,我想将它们绘制为 fiddle 图: set.seed(1) df 0, group] 现在我们可以根据他们是否应该有 fiddle 来使用不同的跟踪样式来绘制组 plot_ly
我在新的 Sencha Fiddle 中找不到我保存的 fiddle : 我曾经能够点击右上角的我的名字并获得保存的 fiddle 列表。 我再也找不到我保存的 fiddle 了。 最佳答案 使用搜索
我试过 violin在 Seaborn 中为每个 fiddle 绘制不同的颜色: sns.violinplot(x='type', y='den', data=mydf, ax=axes[0], co
创建将一把 fiddle 按 hue 分割的 fiddle 情节的正确方法是什么? 我尝试了不同的方法,似乎唯一的方法是为数据集中的每个条目创建一个共享相同值的特征。并将该功能的名称作为 x 传递。
我最近创建了一个成功编译并返回所需结果的查询。当我将该段代码用作 stackoverflow 上的用户为我提供的另一段代码中的子查询时,我遇到了一些问题,这些问题最终得到了解决。我试图在给我的那段代码
我正在尝试创建一个分组的 fiddle 图(见图),我在其中为四个分类变量绘制了 3 个级别。考虑到这些数据,除了盒子与后面更宽的 fiddle 图颜色相同使它们难以查看这一事实外,该图效果很好。理想
我有具有结构的 Pandas 数据框: A B 0 1 1 1 2 1 2 3 4 3 3 7 4 6 8 如何生成 Seaborn Violin 图,每列作为其自己的单独
也许这是一个愚蠢的想法,或者是一个脑电波。我有 4 个不同物种的脂质类数据集。数据是成比例的,总和是 1000。我想可视化每个物种中每个类别的比例差异。一般来说,堆积条形图是这里的方法,但是有几个类,
需要根据匹配的键删除重复的对象,但添加值。已经创建了片段和 fiddle 来查看。还在底部添加了预期结果。 我尝试了几种不同的方法,但无法获得预期的结果。我可以使用过滤器方法,但无法为匹配键添加值。请
这可能是最大的菜鸟问题,但我的代码可以在 fiddle 中工作,而不是在我的 html 中工作。少了什么东西?这是 fiddle 链接,下面是我的index.html:http://jsfiddle.
请查看the following mysql fiddle ... 现在只插入了最后一个值,即“18”。我不想只插入“18”,而是想插入例如“3;” 4; 9; 18'所以我希望该字段包含多个值。 我
抱歉标题不好,但我什至不知道如何解释... 这是 fiddle :http://sqlfiddle.com/#!2/f21e3/5 所以我得到了一个非常基本的产品表和我的数据表(在本例中为 tyds)
我正在尝试合并 2 个代码。我找到了我要找的两个代码。我真的很新@this所以请理解。 这是页眉页脚和背景: http://jsfiddle.net/F6dez/ 这是下拉菜单: http://jsf
我正在尝试制作this fiddle在网页上工作但没有成功。我以前做过这个,但是这个 fiddle 不起作用。 我尝试添加google的jquery或min jquery,但没有成功。我还尝试在 di
如果我从这里复制代码:https://jsfiddle.net/agt10exp/ 它在 fiddle 上运行良好,但是当我在我的电脑上创建一个新文件并将代码粘贴到其中时,我得到了相同的布局,但是它无
找不到与我的问题完全相关的主题。 我有这两个 div,DEMO here : Tab 我希望选项卡固定在绿色 div 的右下角的特定位置: 距绿色 div 顶部的 0px 距离(无论如何我认为这是
如何使用 ggplot2 像在 R 中一样绘制 fiddle 图?在 ggplot2 中,您可以创建漂亮的 fiddle 图,例如: ggplot(dat,aes(value,prob)) + geo
我想创建一个表that would look like this fiddle 我想知道当前代码是否是创建这种外观的最佳方式? HTML:
我尝试用 R 包 ggplot2 和代码绘制 fiddle 图 norm2 = function(v) return(sqrt(sum(v*v))) myfct = function(d) { v
我正在寻找一种方法来绘制带有许多 fiddle (列)的 fiddle 图。问题是我的专栏的长度各不相同。例如,它是这样的: "V1" "V2" "V1" 9 255.5 "V2" 432 286 "
我是一名优秀的程序员,十分优秀!