ggplot помещает сюжет внутри другого сюжета? [Дубликат]

Одна из причин, по которой вам нужно реализовать интерфейс, а не расширять базовый класс, заключается в том, что вы уже расширяете какой-либо другой класс. Вы можете расширить только один класс, но вы можете реализовать любое количество интерфейсов.

Если вы расширяете Thread, вы в основном предотвращаете выполнение вашей логики любым другим потоком, чем «это». Если вы хотите, чтобы поток выполнял вашу логику, лучше всего реализовать Runnable.

16
задан zx8754 19 August 2016 в 21:00
поделиться

4 ответа

В разделе 8.4 из книга объясняет, как это сделать. Хитрость заключается в использовании пакета grid пакета viewport s.

#Any old plot
a_plot <- ggplot(cars, aes(speed, dist)) + geom_line()

#A viewport taking up a fraction of the plot area
vp <- viewport(width = 0.4, height = 0.4, x = 0.8, y = 0.2)

#Just draw the plot twice
png("test.png")
print(a_plot)
print(a_plot, vp = vp)
dev.off()
23
ответ дан jbaums 18 August 2018 в 19:53
поделиться
  • 1
    Стоит отметить, что, если вы хотите, чтобы в качестве вставки был другой сюжет, критическая линия должна быть print(another_plot, vp = vp). Мне потребовалось некоторое время, чтобы понять. +1 – mts 9 April 2017 в 20:44

Я предпочитаю решения, которые работают с ggsave. После многогоголоса я закончил с этим (что является общей формулой для позиционирования и определения размера, который вы вставляете.

library(tidyverse)

plot1 = qplot(1.00*mpg, 1.00*wt, data=mtcars)  # Make sure x and y values are floating values in plot 1
plot2 = qplot(hp, cyl, data=mtcars)
plot(plot1)

# Specify position of plot2 (in percentages of plot1)
# This is in the top left and 25% width and 25% height
xleft   = 0.05
xright  = 0.30
ybottom = 0.70
ytop    = 0.95 

# Calculate position in plot1 coordinates
# Extract x and y values from plot1
l1 = ggplot_build(plot1)
x1 = l1$layout$panel_ranges[[1]]$x.range[1]
x2 = l1$layout$panel_ranges[[1]]$x.range[2]
y1 = l1$layout$panel_ranges[[1]]$y.range[1]
y2 = l1$layout$panel_ranges[[1]]$y.range[2]
xdif = x2-x1
ydif = y2-y1
xmin  = x1 + (xleft*xdif)
xmax  = x1 + (xright*xdif)
ymin  = y1 + (ybottom*ydif)
ymax  = y1 + (ytop*ydif) 

# Get plot2 and make grob
g2 = ggplotGrob(plot2)
plot3 = plot1 + annotation_custom(grob = g2, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax)
plot(plot3)

ggsave(filename = "test.png", plot = plot3)

# Try and make a weird combination of plots
g1 <- ggplotGrob(plot1)
g2 <- ggplotGrob(plot2)
g3 <- ggplotGrob(plot3)

library(gridExtra)
library(grid)

t1 = arrangeGrob(g1,ncol=1, left = textGrob("A", y = 1, vjust=1, gp=gpar(fontsize=20)))
t2 = arrangeGrob(g2,ncol=1, left = textGrob("B", y = 1, vjust=1, gp=gpar(fontsize=20)))
t3 = arrangeGrob(g3,ncol=1, left = textGrob("C", y = 1, vjust=1, gp=gpar(fontsize=20)))

final = arrangeGrob(t1,t2,t3, layout_matrix = cbind(c(1,2), c(3,3)))
grid.arrange(final)

ggsave(filename = "test2.png", plot = final)

12
ответ дан pallevillesen 18 August 2018 в 19:53
поделиться
  • 1
    Я думаю, что они обновили пакет ggplot, и теперь, чтобы извлечь позицию из координат plot1, формат должен выглядеть примерно так: l1$layout$panel_ranges[[1]]$x.range[1]. Обратите внимание на l1$layout$panel_ranges.... – anotherFishGuy 4 December 2017 в 22:39
  • 2
    Ты прав. Я соответствующим образом обновил ответ. – pallevillesen 14 December 2017 в 10:42

Более простое решение с использованием ggplot2 и egg. Самое главное, что это решение работает с ggsave.

library(ggplot2)
plotx <- ggplot(mpg, aes(displ, hwy)) + geom_point()
plotx + 
  annotation_custom(
    ggplotGrob(plotx), 
    xmin = 5, xmax = 7, ymin = 30, ymax = 44
  )
ggsave(filename = "inset-plot.png")
1
ответ дан stackinator 18 August 2018 в 19:53
поделиться
  • 1
    Привет, старейшина. +1 для краткого примера и упоминания пакета egg. Обратите внимание, что просто использование library(ggplot2) более чем достаточно (для него не нужны дополнительные tidyverse и egg), – Valentin 14 August 2018 в 19:26
1
ответ дан Valentin 30 October 2018 в 08:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: