2
A
回答
2
如果您希望避免繪圖兩次,可以執行以下操作。自從引入extension mechanism以來,我們可以輕鬆修改現有的source code來定義我們自己的幾何。
首先我們需要檢查geom_violin
中發生了什麼。實際繪圖是用GeomPolygon$draw_panel(newdata, ...)
完成的。所以訣竅是鼓搗geom_polygon
。所需的修飾是非常簡單的:在密謀阻止
polygonGrob(munched$x, munched$y, default.units = "native",
id = munched$group,
gp = gpar(
col = alpha(first_rows$colour, first_rows$alpha),
fill = alpha(first_rows$fill, first_rows$alpha),
lwd = first_rows$size * .pt,
lty = first_rows$linetype
)
)
只需更換顏色規格col = first_rows$colour
。
好的,我們很好去。只需聲明我們的自定義geom_violin2
,從原始來源借用代碼並應用幾個臨時修復。
library(grid)
GeomPolygon2 <- ggproto("GeomPolygon2", Geom,
draw_panel = function(data, panel_scales, coord) {
n <- nrow(data)
if (n == 1) return(zeroGrob())
munched <- coord_munch(coord, data, panel_scales)
munched <- munched[order(munched$group), ]
first_idx <- !duplicated(munched$group)
first_rows <- munched[first_idx, ]
ggplot2:::ggname("geom_polygon",
polygonGrob(munched$x, munched$y, default.units = "native",
id = munched$group,
gp = gpar(
col = first_rows$colour,
fill = alpha(first_rows$fill, first_rows$alpha),
lwd = first_rows$size * .pt,
lty = first_rows$linetype
)
)
)
},
default_aes = aes(colour = "NA", fill = "grey20", size = 0.5, linetype = 1,
alpha = NA),
handle_na = function(data, params) {
data
},
required_aes = c("x", "y"),
draw_key = draw_key_polygon
)
`%||%` <- function (a, b)
{
if (!is.null(a))
a
else b
}
GeomViolin2 <- ggproto("GeomViolin", Geom,
setup_data = function(data, params) {
data$width <- data$width %||%
params$width %||% (resolution(data$x, FALSE) * 0.9)
plyr::ddply(data, "group", transform,
xmin = x - width/2,
xmax = x + width/2
)
},
draw_group = function(self, data, ..., draw_quantiles = NULL) {
data <- transform(data,
xminv = x - violinwidth * (x - xmin),
xmaxv = x + violinwidth * (xmax - x)
)
newdata <- rbind(
plyr::arrange(transform(data, x = xminv), y),
plyr::arrange(transform(data, x = xmaxv), -y)
)
newdata <- rbind(newdata, newdata[1,])
if (length(draw_quantiles) > 0) {
stopifnot(all(draw_quantiles >= 0), all(draw_quantiles <= 1))
quantiles <- create_quantile_segment_frame(data, draw_quantiles)
aesthetics <- data[
rep(1, nrow(quantiles)),
setdiff(names(data), c("x", "y")),
drop = FALSE
]
both <- cbind(quantiles, aesthetics)
quantile_grob <- GeomPath$draw_panel(both, ...)
ggplot2:::ggname("geom_violin", grobTree(
GeomPolygon2$draw_panel(newdata, ...),
quantile_grob)
)
} else {
ggplot2:::ggname("geom_violin", GeomPolygon2$draw_panel(newdata, ...))
}
},
draw_key = draw_key_polygon,
default_aes = aes(weight = 1, colour = "grey20", fill = "white", size = 0.5,
alpha = NA, linetype = "solid"),
required_aes = c("x", "y")
)
geom_violin2 <- function(mapping = NULL, data = NULL, stat = "ydensity",
draw_quantiles = NULL, position = "dodge",
trim = TRUE, scale = "area",
na.rm = FALSE, show.legend = NA, inherit.aes = TRUE,
...) {
layer(
data = data,
mapping = mapping,
stat = stat,
geom = GeomViolin2,
position = position,
show.legend = show.legend,
inherit.aes = inherit.aes,
params = list(
trim = trim,
scale = scale,
draw_quantiles = draw_quantiles,
na.rm = na.rm,
...
)
)
}
現在看!我承認,顏色是可疑的。但是您可以清楚地看到邊框不受alpha
的影響。
ggplot(mtcars, aes(factor(cyl), mpg)) +
geom_violin2(alpha = 0.7, size = 3, colour = "blue", fill = "red")
相關問題
- 1. 透明度着色器用透明色填充透明片段
- 2. 用透明色填充密度曲線
- 3. SVG填充顏色透明度/ alpha?
- 4. Raphael填充不透明度在member.mouseover
- 5. 圖層不透明度vs填充Photoshop
- 6. 帆布填充樣式與透明間隔/不透明度
- 7. 開羅填充透明
- 8. 帶透明填充的NSBezierPath
- 9. 如何用透明色填充桌面?
- 10. 的Android Layerlist用實心填充圈內透明填充外圓
- 11. SVG線性漸變填充不透明度梯度
- 12. 使用填充不透明度表示多個數據集highcharts
- 13. 如何用進度條填充透明圖像? #CSS #HTML #Jquery?
- 14. 填充透明div中嵌套的SVG對象的不透明度
- 15. 爲什麼填充不透明度會改變填充的陰影?
- 16. Javascript - 畫布 - 在previousley上填充透明png填充顏色
- 17. 帶透明填充物的角DIV
- 18. Matplotlib在圖像透明填充
- 19. Safari渲染Fontawesome與透明填充
- 20. 爲什麼填充0xFFFFFFFF是透明的?
- 21. actionscript 3.0透明圖像填充
- 22. 繪製透明圓形外部填充
- 23. 如何填充不透明度矩形的Android
- 24. 繪製一個低透明度的填充矩形
- 25. 顯示透明度和填充顏色的ggplot圖例
- 26. 字段填充後更改不透明度
- 27. WPF形狀中風和填充不同的不透明度
- 28. Highcharts在legendItemClick上更改了一系列填充不透明度
- 29. VBA在透明度與實心填充之間區分圖像
- 30. 二維核密度圖和透明輪廓填充R
情節兩次,一次爲線,一次填充。 – alistaire