【发布时间】:2019-07-10 12:37:56
【问题描述】:
我正在尝试制作一个堆叠条形图,将一个变量映射到 log10 刻度上。我想通过 ggplotly 传递它,以便通过工具提示进行数据检查。
有两个问题。首先,当我在 scale_fill_gradientn 中记录转换 VAR.B 的比例时,工具提示会显示转换后的数据,而图表会以其原始比例显示数据,这无济于事。
但是,当我在 ggplot 中包含文本审美以解决此问题时,它会破坏填充顺序。我一直无法找到解决这两个问题的方法。
我已经尝试 log10 在数据帧本身中转换 VAR.B。在这种情况下,工具提示与显示的数据相匹配,但我认为这对我的观众来说并不容易理解。此外,将数据集保留为线性比例会丢失故事的重要部分。
数据集
a<-structure(list(VAR.A = c("A", "A", "A", "A", "A", "A", "A", "A",
"A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B"),
VAR.B = c(1, 2, 3, 5, 8, 9, 10, 12, 13, 15, 1, 10, 30, 35,
40, 60, 80, 100, 140, 160), rel.freq = c(3.076923077, 4.615384615,
7.692307692, 12.30769231, 15.38461538, 6.153846154, 30.76923077,
3.076923077, 7.692307692, 9.230769231, 1.754385965, 3.50877193,
26.31578947, 1.754385965, 17.54385965, 35.0877193, 3.50877193,
5.263157895, 3.50877193, 1.754385965)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L), spec = structure(list(
cols = list(VAR.A = structure(list(), class = c("collector_character",
"collector")), VAR.B = structure(list(), class = c("collector_double",
"collector")), counts = structure(list(), class = c("collector_double",
"collector")), rel.freq = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
依赖关系
library(ggplot2)
library(viridis)
library(plotly)
library(scales)
这个图表看起来应该是这样,但是 VAR.B 的悬停文本中显示的值与原始比例不匹配
f <- ggplot(a, aes(x=VAR.A, y= rel.freq, fill = VAR.B)) +
geom_bar(width = 1, size = 1, stat = "identity") +
scale_fill_gradientn(colors = viridis(10, option = 'inferno'), limits = c(0.1, 160), breaks = c(0.1,0.3, 1, 3, 10, 30, 100),
trans = "log10", guide = guide_colorbar(draw.llim = FALSE, draw.ulim = FALSE), oob = squish) +
theme_classic()
f<- ggplotly(f)
f
此图看起来杂乱无章,但 VAR.B 悬停文本中显示的值确实与原始比例匹配。
g <- ggplot(a, aes(x=VAR.A, y= rel.freq, fill = VAR.B, text = paste0('VAR.B:', VAR.B))) + geom_bar(width = 1, size = 1, stat = "identity") +
scale_fill_gradientn(colors = viridis(10, option = 'inferno'), limits = c(0.1, 160), breaks = c(0.1,0.3, 1, 3, 10, 30, 100),
trans = "log10", guide = guide_colorbar(draw.llim = FALSE, draw.ulim = FALSE), oob = squish) +
theme_classic()
g <- ggplotly(g, tooltip = c('VAR.A','VAR.B','text'))
g
如果我将 paste0() 函数排除在文本美学之外并且只调用 VAR.B 本身,则工具提示会以原始比例显示数据并保留填充顺序。但是在这种情况下,工具提示没有为数据提供标签。
h <- ggplot(a, aes(x=VAR.A, y= rel.freq, fill = VAR.B, text = VAR.B)) +
geom_bar(width = 1, size = 1, stat = "identity") +
scale_fill_gradientn(colors = viridis(10, option = 'inferno'), limits = c(0.1, 160), breaks = c(0.1,0.3, 1, 3, 10, 30, 100),
trans = "log10", guide = guide_colorbar(draw.llim = FALSE, draw.ulim = FALSE), oob = squish) +
theme_classic()
h <- ggplotly(h, tooltip = c('VAR.A','VAR.B','text'))
h
在我看来,文本美学中的 paste0() 函数被窃听了。如果有人能想到另一种方法来一次解决所有这些问题,我将不胜感激。
【问题讨论】:
-
在
ggplot调用之前使用paste0会发生什么? -
我也试过了。如果我使用 paste0 创建一个单独的变量并在文本美学中调用该新变量,它仍然会破坏填充顺序。感谢您的提问!