Я пытаюсь составить столбчатую диаграмму, отображающую переменную для заполнения в масштабе log10. Я хотел бы передать его через ggplotly, чтобы иметь возможность проверки данных с помощью всплывающей подсказки.
Есть две проблемы. Во-первых, когда я регистрирую преобразование масштаба VAR.B в scale_fill_gradientn, всплывающие подсказки отображают преобразованные данные, в то время как график отображает данные в исходном масштабе, что бесполезно.
Однако, когда я включаю эстетику текста в ggplot, чтобы исправить эту проблему, он нарушает порядок заполнения. Я не смог найти способ исправить обе проблемы.
Я попытался log10 преобразовать VAR.B в самом кадре данных. В этом случае всплывающие подсказки соответствуют отображаемым данным, но я не думаю, что это будет легко доступно для моей аудитории. Кроме того, оставление набора данных в линейном масштабе теряет важную часть истории.
Dataset
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"))
1012 * Зависимость *
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 () в эстетике текста содержит ошибки. Если кто-то может придумать другой способ исправить все эти проблемы сразу, я был бы очень признателен.