Организуйте много участков с помощью gridExtra
Я потратил много часов, пытаясь поместить 11 графиков в один график и расположить их с помощью gridExtra
, но я потерпел неудачу, поэтому я обращаюсь к вам, надеясь, что вы можете помочь.
size1
) и другие 11 классификаций (size2
), и я хочу построить график, как средняя цена для каждого увеличения size1
и увеличения clarity
(от 1 до 6) изменяется при увеличении size2
алмазов, и построить все 11 графиков в одном графике.
Я попробовал использовать gridExtra
, Как было предложено в другие сообщения, но легенда находится далеко справа, и все графики сжаты слева, не могли бы вы помочь мне выяснить, как должны быть указаны "ширины" для легенды в gridExtra
? Я не могу найти никаких хороших объяснений. Большое спасибо за вашу помощь, я действительно ценю это...
Я пытался найти хороший пример, чтобы воссоздать мой фрейм данных, но потерпел неудачу и в этом. Я надеюсь, что этот фрейм данных поможет понять, что я пытаюсь сделать, я не смог заставить его работать и быть так же, как и у меня, и некоторые графики не имеют достаточного количества данных, но важной частью является расположение графиков с использованием gridExtra
(хотя если у вас есть другие комментарии по другим частям, пожалуйста, дайте мне знать):
library(ggplot2)
library(gridExtra)
df <- data.frame(price=matrix(sample(1:1000, 100, replace = TRUE), ncol = 1))
df$size1 = 1:nrow(df)
df$size1 = cut(df$size1, breaks=11)
df=df[sample(nrow(df)),]
df$size2 = 1:nrow(df)
df$size2 = cut(df$size2, breaks=11)
df=df[sample(nrow(df)),]
df$clarity = 1:nrow(df)
df$clarity = cut(df$clarity, breaks=6)
# Create one graph for each size1, plotting the median price vs. the size2 by clarity:
for (c in 1:length(table(df$size1))) {
mydf = df[df$size1==names(table(df$size1))[c],]
mydf = aggregate(mydf$price, by=list(mydf$size2, mydf$clarity),median);
names(mydf)[1] = 'size2'
names(mydf)[2] = 'clarity'
names(mydf)[3] = 'median_price'
assign(paste("p", c, sep=""), qplot(data=mydf, x=as.numeric(mydf$size2), y=mydf$median_price, group=as.factor(mydf$clarity), geom="line", colour=as.factor(mydf$clarity), xlab = "number of samples", ylab = "median price", main = paste("region number is ",c, sep=''), plot.title=element_text(size=10)) + scale_colour_discrete(name = "clarity") + theme_bw() + theme(axis.title.x=element_text(size = rel(0.8)), axis.title.y=element_text(size = rel(0.8)) , axis.text.x=element_text(size=8),axis.text.y=element_text(size=8) ))
}
# Couldnt get some to work, so use:
p5=p4
p6=p4
p7=p4
p8=p4
p9=p4
# Use gridExtra to arrange the 11 plots:
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}
mylegend<-g_legend(p1)
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
p2 + theme(legend.position="none"),
p3 + theme(legend.position="none"),
p4 + theme(legend.position="none"),
p5 + theme(legend.position="none"),
p6 + theme(legend.position="none"),
p7 + theme(legend.position="none"),
p8 + theme(legend.position="none"),
p9 + theme(legend.position="none"),
p10 + theme(legend.position="none"),
p11 + theme(legend.position="none"),
main ="Main title",
left = ""), mylegend,
widths=unit.c(unit(1, "npc") - mylegend$width, mylegend$width), nrow=1)
1 ответ:
Мне пришлось немного изменить вызов цикла
qplot
(т. е. поместить факторы во фрейм данных), так как он вызывал ошибку несоответствующего размера. Я не включаю этот бит, так как эта часть, очевидно, работает в вашей среде, или это была странная паста.Попробуйте настроить свои
widths
блоки следующим образом:widths=unit(c(1000,50),"pt")
И вы получите что-то немного ближе к тому, что вы, вероятно, ожидали:
И, я могу вставить код теперь через несколько месяцев :- )
library(ggplot2) library(gridExtra) df <- data.frame(price=matrix(sample(1:1000, 100, replace = TRUE), ncol = 1)) df$size1 = 1:nrow(df) df$size1 = cut(df$size1, breaks=11) df=df[sample(nrow(df)),] df$size2 = 1:nrow(df) df$size2 = cut(df$size2, breaks=11) df=df[sample(nrow(df)),] df$clarity = 1:nrow(df) df$clarity = cut(df$clarity, breaks=6) # Create one graph for each size1, plotting the median price vs. the size2 by clarity: for (c in 1:length(table(df$size1))) { mydf = df[df$size1==names(table(df$size1))[c],] mydf = aggregate(mydf$price, by=list(mydf$size2, mydf$clarity),median); names(mydf)[1] = 'size2' names(mydf)[2] = 'clarity' names(mydf)[3] = 'median_price' mydf$clarity <- factor(mydf$clarity) assign(paste("p", c, sep=""), qplot(data=mydf, x=as.numeric(size2), y=median_price, group=clarity, geom="line", colour=clarity, xlab = "number of samples", ylab = "median price", main = paste("region number is ",c, sep=''), plot.title=element_text(size=10)) + scale_colour_discrete(name = "clarity") + theme_bw() + theme(axis.title.x=element_text(size = rel(0.8)), axis.title.y=element_text(size = rel(0.8)), axis.text.x=element_text(size=8), axis.text.y=element_text(size=8) )) } # Use gridExtra to arrange the 11 plots: g_legend<-function(a.gplot){ tmp <- ggplot_gtable(ggplot_build(a.gplot)) leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") legend <- tmp$grobs[[leg]] return(legend)} mylegend<-g_legend(p1) grid.arrange(arrangeGrob(p1 + theme(legend.position="none"), p2 + theme(legend.position="none"), p3 + theme(legend.position="none"), p4 + theme(legend.position="none"), p5 + theme(legend.position="none"), p6 + theme(legend.position="none"), p7 + theme(legend.position="none"), p8 + theme(legend.position="none"), p9 + theme(legend.position="none"), p10 + theme(legend.position="none"), p11 + theme(legend.position="none"), top ="Main title", left = ""), mylegend, widths=unit(c(1000,50),"pt"), nrow=1)
Edit (16.07.2015): с
gridExtra
>= 2.0.0 параметрmain
был переименован вtop
.