#r #pdf #ggplot2 #r-markdown #xelatex
Вопрос:
Я пытаюсь добавить следующее изображение на эту диаграмму, однако, как вы можете видеть, когда я использую его для создания pdf-файла, изображение становится прозрачным! с этим альфой 45-го калибра. Если я установлю альфа на 1, то он будет отображаться так, как и должно быть!
В этом примере я использую alpha только для того, чтобы сделать вторую диаграмму dodge прозрачной, но включенный png должен быть на 100% цветным, не выцветшим! Знаете ли вы какой-нибудь способ добиться этого, я все еще хочу, чтобы эти наборы полос исчезли с альфа-изображением, но изображение осталось нетронутым.
Обратите внимание, что если вы просто запустите это в своем Rmarkdown, изображение в предварительном просмотре будет выглядеть превосходно, проблема возникнет, когда мы свяжем и создадим pdf-файл!
Пожалуйста, Помогите
Это выцветший нежелательный результат изображения лошади на графике при переходе в pdf:
Код, который я использовал, находится здесь:
library(ggplot2)
library(reshape2)
library(grid)
#Create DataFrame
x <- c(5,17,31,9,17,10,30,28,16,29,14,34)
y <- c(39,6,3,4,1,6,7,2,9,10,3,4)
day <- c("d1","cd2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12")
df1 <- data.frame(x, y, day)
#Sort the table according to x values
df1$day <- factor(df1$day, levels = df1[order(-df1$x), 3])
#for each day (e.g. 1) you will have all combinations of x and y (e.g. day = 1, x = 5, y = 5), (e.g. day = 12, x=34, y=4). variable becomes x and y, and value becomes the value of either x or y.
df2 <- melt(df1, id.var="day", measure.var=c("x","y"))
#head(df2)
#Image
img <- readPNG("imgs/unnamed.png")
g <- rasterGrob(img, interpolate=TRUE)
barcolors <- c("#428953", "#CE2929", "#A3DD57", "#77E599", "#5675D6", "#65ECEF", "#FF8B07", "#D0B100", "#636363", "#D0B100", "#CE2929", "#428953")
ggplot(df2, aes(x=day, y=value))
geom_bar(aes(fill=day, alpha=variable), stat="identity", width = .75, position = position_dodge(width=.8))
scale_alpha_manual(values=c(1, .45))
scale_fill_manual(values= barcolors)
theme_bw()
theme( panel.grid.major.x = element_blank(),
legend.position="none",
legend.text=element_text(size=14),
legend.title = element_blank(),
axis.title.x = element_blank())
annotation_custom(g, xmin=.7, xmax=1.3, ymin=35, ymax=40) ylim(0,40)
Комментарии:
1. Попробуйте переместить
alpha=
отображение из глобальногоggplot()
вызоваaes()
внутрьgeom_bar
, так как вы хотите, чтобы это повлияло только на бары.2. Я сделал это, но все равно получил тот же результат! так что это не сработало
Ответ №1:
Это может быть не объяснением причины, а рабочим решением.
library(tidyverse)
library(reshape2)
library(grid)
library(png)
df = tibble(
x = c(5,17,31,9,17,10,30,28,16,29,14,34),
y = c(39,6,3,4,1,6,7,2,9,10,3,4),
day = c("d1","cd2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12")
) %>% mutate(
day = day %>% fct_reorder(x)
) %>% pivot_longer(cols=1:2, names_to = "variable", values_to = "value")
img <- readPNG("imgs/unnamed.png")
g <- rasterGrob(img, interpolate=TRUE)
barcolors <- c("#428953", "#CE2929", "#A3DD57", "#77E599", "#5675D6", "#65ECEF", "#FF8B07", "#D0B100", "#636363", "#D0B100", "#CE2929", "#428953")
df %>% ggplot(aes(x=day, y=value, alpha=variable))
geom_bar(aes(fill=day), stat="identity", width = .75, position = position_dodge(width=.8))
annotation_custom(g, xmin=.7, xmax=1.3, ymin=35, ymax=40)
annotation_custom(g, xmin=.7, xmax=1.3, ymin=35, ymax=40)
scale_alpha_manual(values=c(1, .45))
scale_fill_manual(values= barcolors)
theme_bw()
theme( panel.grid.major.x = element_blank(),
legend.position="none",
legend.text=element_text(size=14),
legend.title = element_blank(),
axis.title.x = element_blank())
ylim(0,40)
Ниже приведена выдержка из pdf-файла.
А вот фрагмент из HTML-файла.
Комментарии:
1. Я позволил себе слегка изменить ваш чит на более dplyr-стиль.
2. Проверив свой пример, просто добавьте annotation_custom(g, xmin=.7, xmax=1.3, ymin=35, ymax=40) annotation_custom(g, xmin=.7, xmax=1.3, ymin=35, ymax=40) дважды сделали свое дело.