Слияние без границ и скорректированный размер графика с помощью ggplot2 + gridExtra - PullRequest
0 голосов
/ 17 июня 2020

Я хотел бы легко объединить 3 участка. Моя проблема в том, что графики немного сдвинуты, и даже если я рисую их без границ, они не сливаются плавно между графиками 1 и 2 / графиком 2 и 3.

library(tidyverse)
library(gridExtra)

plot1 <- ggplot(df) +
  theme_dark() +
  geom_line(aes(y = Price, x = time, color = "#00FFFF"), size = 0.7) +
  geom_area(aes(y = Price, x = time), fill = "#00FFFF", alpha = .1) +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        legend.position = c(.1, .95),
        legend.justification = c("right", "top"),
        legend.box.just = "right",
        legend.margin = margin(3, 3, 3, 3),
        plot.margin = margin(0,-0.5,-0.5,-0.5),
        plot.background = element_rect(fill = "#808080")) +
  scale_colour_manual(name = "Price", 
                      values = c("#00FFFF" = "#00FFFF"), labels = c("Stock")) +
  labs(y = "")
#  
plot1
#
plot2 <- ggplot(df) +
  theme_dark() +
  geom_bar(aes(x = time, y = B, fill = "green"), stat = "identity") +
  geom_bar(aes(x = time, y = S, fill = "red"), stat = "identity") +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        panel.border = element_blank(),
        legend.position = c(.1, .95),
        legend.justification = c("right", "top"),
        legend.box.just = "right",
        legend.margin = margin(3, 3, 3, 3),
        plot.margin = margin(-0.75,-0.5,0,-0.5),
        plot.background = element_rect(fill = "#808080")) +
  scale_fill_identity(name = "Volume",
                      guide = "legend", labels = c("B", "S")) +
  labs(y = "")
#
plot2
#
plot3 <- ggplot(df) +
  theme_dark() +
  geom_line(aes(y = EMA_short, x = time, color = "blue"), size = 0.7) +
  geom_area(aes(y = EMA_short, x = time), fill = "blue", alpha = .1) +
  geom_line(aes(y = EMA_long, x = time, color = "yellow"), size = 0.7) +
  geom_area(aes(y = EMA_long, x = time), fill = "yellow", alpha = .1) +
  theme(axis.title.x=element_blank(),
        axis.ticks.x=element_blank(),
        panel.border = element_blank(),
        legend.position = c(.1, .95),
        legend.justification = c("right", "top"),
        legend.box.just = "right",
        legend.margin = margin(3, 3, 3, 3),
        plot.margin = margin(-0.75,-0.5,2,-0.5),
        plot.background = element_rect(fill = "#808080")) +
  scale_colour_manual(name = "EMA", 
                      values = c("blue" = "blue", "yellow" = "yellow"), labels = c("EMA50", "EMA200")) +
  labs(y = "")
#
plot3
#
gA <- ggplotGrob(plot1)
gB <- ggplotGrob(plot2)
gC <- ggplotGrob(plot3)
grid::grid.newpage()
grid::grid.draw(rbind(gA, gB, gC))

На мой взгляд, я бы хотел 3 графика должны слиться друг с другом таким же образом, как здесь: similar plot

Я благодарен за любой совет.

Edit

Спасибо за очень полезные ответы. У меня сейчас только две небольшие проблемы с оптикой. Хотя я позиционировал все легенды одинаково, они расположены где-то в другом месте. Должен ли я форматировать их всех до одного размера? И, к сожалению, слева есть два маленьких белых пятна, как показано на картинке. Я уже пытался делать края больше и меньше, но пятна всегда остаются белыми. Я обновил свой новый код выше. Спасибо! enter image description here

Ответы [ 2 ]

1 голос
/ 18 июня 2020

1 - Вы создали собственную легенду, указав аргументы в параметре theme(), например,

plot1 + theme(legend.background = element_blank(), legend.text.align=0, legend.title.align = 0))
#a legend with no white background, left text and title alignment. 

2- Область, в которой строки легенды имеют параметр guides(), чтобы указать ваш особый ключ:

# (e.g., remove the little grey area background for the legend):
 plot1 + guides(color=guide_legend(override.aes=list(fill=NA)))

3- Если необходимо, прочтите некоторые параметры theme() и guides() fun c, чтобы понять - кратные - аргументы темы и создать свой personnal-darky-style-func().

1 голос
/ 17 июня 2020

Вам следует рассмотреть возможность расширения (c (0,0)) и / или темы (plot.margin = c (t, r, b, l))

Сначала добавьте x и y развернуть параметры для каждого графика, чтобы скрыть пустое пространство вокруг ваших данных, что является значением по умолчанию для ggplot:

plot1 + scale_y_continuous("", expand = c(0,0)) 
# we indicate here 'no label', so you should supress '+ ylab()'
plot1 + scale_x_datetime("", expand = c(0,0)) 
# same, you should supress 'xlab()' from the plots
Это позволяет вам с минимальным запасом, добавленным между графиками с помощью grid.arrange, и вы можете настроить их с помощью theme(plot.margin = c(t,r,b,l)) (например, plot1 +theme(plot.margin(-0.5,-0.5,-0.5,-0.5))). В вашем случае вам, возможно, потребуется адресовать верхнюю и / или нижнюю часть двух графиков (будьте осторожны со средним, если два других не имеют полей). Иногда вам нужно поиграйте с размером вывода (высотой и шириной grid.arrange), как правило, когда вы сохраняете объект аранжировки (например, ggsave( arrangeGrob(plot1, plot2)) необходимо указать размеры). Обратите внимание, что вы должны поместите легенду сверху, снизу или внутри графиков, чтобы сложить графики с одинаковыми размерами «области данных». Когда легенды имеют разный размер, вы не можете складывать графики с легендой в левом или правом положении. Итак, добавьте +theme(legend.position = 'top') для ваших 3 графиков или bottom или какую-либо координату.
...