ফাইল সংরক্ষণের জন্য গ্রিড.আরঞ্জ () প্লট সংরক্ষণ করা হচ্ছে


137

আমি একাধিক প্লট ব্যবহার করে ggplot2তাদের ব্যবহার করে সাজানোর চেষ্টা করছি grid.arrange()। যেহেতু আমি আমার যে সমস্যাটি পেয়েছি তা সঠিকভাবে বর্ণনা করতে কাউকে খুঁজে পেতে পেরেছি, তাই আমি লিঙ্ক থেকে সমস্যার বিবরণ থেকে উদ্ধৃত করেছি :

যখন আমি ব্যবহার ggsave()পর grid.arrange(), অর্থাত্

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

আমি গ্রিড প্লটটি সংরক্ষণ করি না তবে শেষ স্বতন্ত্র ggplot। প্রকৃতপক্ষে প্লটটি সংরক্ষণ করার মতো কোনও উপায় grid.arrange()ব্যবহার করে ggsave()বা অনুরূপ কিছু ব্যবহার করে প্রদর্শিত হয়েছে ? পুরানো উপায় ব্যবহার ছাড়া অন্য

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

একই লিঙ্কটি নীচে সমাধান দেয়:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

তবে, ggsave()নীচের কোডটিতে grid.arrange()কলটির আউটপুট সংরক্ষণ করতে কীভাবে ব্যবহার করবেন তা আমি বুঝতে পারি না , যা লিঙ্ক থেকে নেওয়া হয়েছে :

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

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)}

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?

6
ব্যবহার করুনpng(); grid.arrange(); ggplot(); ggplot(); dev.off()
অ্যান্ড্রি

2
না print(ggplot())?
আইআরটিএফএম

হ্যাঁ, সম্ভবত! :-)
অ্যান্ড্রি

1
@ এন্ড্রি আপনি পরামর্শ দিচ্ছেন যা কাজ করে তবে চিত্রটির রেজোলিউশন খুব কম। আমি যখন একটি একক ggplotব্যবহার করে সংরক্ষণ করি তখন ggsave()চিত্রটির রেজোলিউশন অনেক বেশি is grid.arrange()একটি উচ্চ রেজোলিউশনের সাথে আউটপুট সংরক্ষণ করার কোনও উপায় আছে , যেমন এটি যদি একক প্লট দ্বারা সংরক্ষণ করা হত ggsave()? যদি আমি উদাহরণগুলির জন্য বিকল্পগুলি সরবরাহ করি png(...,height=1600, width=2500)তবে চিত্রটি খুব ঝাপসা দেখাচ্ছে।
আমি

উত্তর:


142

grid.arrangeসরাসরি একটি ডিভাইসে আঁকুন। arrangeGrobঅন্যদিকে, কিছুই আঁকেন না তবে একটি ছাঁকনা ফেরত দেয় gযা আপনি যেতে পারেন ggsave(file="whatever.pdf", g)

এটি ggplot অবজেক্টের চেয়ে আলাদাভাবে কাজ করার কারণ, যেখানে নির্দিষ্ট না থাকলে ডিফল্টরূপে শেষ প্লটটি সংরক্ষণ করা হয়, তা হ'ল ggplot2 অদৃশ্যভাবে সর্বশেষ প্লটটির উপর নজর রাখে, এবং আমি মনে করি না যে grid.arrangeএই কাউন্টারটির সাথে প্যাকেজে ব্যক্তিগত গোছানো উচিত।


3
আমি যখন এটি চেষ্টা করি তখন আমাকে বলতে ত্রুটি পাই যে জি সঠিক ধরণের নয়?
জ্যাক এইডলি

@ জ্যাকএইডলি একটি ন্যূনতম স্ব-অন্তর্ভুক্ত প্রজননযোগ্য উদাহরণ এবং আপনার সেশনআইএনফো () নিশ্চিত করুন যে আপনার কাছে আর এবং প্যাকেজগুলির সাম্প্রতিক সংস্করণ রয়েছে) একটি নতুন প্রশ্ন জিজ্ঞাসা করুন।
ব্যাপটিস্ট

3
@ ডেভেক্স দয়া করে এই বিভ্রান্তিমূলক তথ্য ছড়িয়ে দেবেন না; plot(g)হয় না একটি gtable, ব্যবহার প্রদর্শন করতে সঠিক ভাবে grid.draw(g)পরিবর্তে।
baptiste

@baptiste ধন্যবাদ ও reworked: লক্ষ্য করুন ফল যদি দেখতে চেষ্টা g <-arrangeGrob(...)সঙ্গে print(g)গ্রাফিক বদলে কোন বস্তু যা গ্রাফিক তালিকা একটি টেক্সট টেবিল পেতে। grid.draw(g)গ্রাফিককে গ্রাফিক হিসাবে রেন্ডার করার চেষ্টা করুন । -
ডেভ এক্স

7
ggsave আর কিছু না কিছু (কিছু বা সমস্ত) গ্রুব নিয়ে কাজ করছে না।
ভ্যাক

47

ব্যাপটিস্টের প্রস্তাব নিয়ে আমার কিছু সমস্যা হয়েছিল, তবে শেষ পর্যন্ত তা পেয়েছি। আপনার ব্যবহার করা উচিত তা এখানে:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

এটি ভাল কাজ করা উচিত।


24

গ্রিড সংরক্ষণের আর একটি সহজ উপায়। পিডিএফ ফাইলে সংরক্ষণ করুন পিডিএফ () ব্যবহার করুন:

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

এটি ggplots ব্যতীত অন্য জিনিসগুলিকে যেমন টেবিলগুলির মতো একীকরণ করতে দেয় ...


7

আমি ভেবেছিলাম এটি এটিকে যুক্ত করার উপযুক্ত। আমার উপরের সমস্যাগুলি ছিল, ggsave এ একটি ত্রুটি তৈরি করে: "প্লটটি একটি ggplot2 প্লট হওয়া উচিত"

এই উত্তরের জন্য ধন্যবাদ: ggplot_build এবং ggplot_gtable ব্যবহার করার পরে ggsave দিয়ে একটি গ্রাফ সংরক্ষণ করার জন্য আমার উপরের কোডটিতে একটি সংশোধনী রয়েছে।

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

ত্রুটিটি ঠিক করার জন্য উপরের লাইনের প্রয়োজন

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

এখন এটা আমার জন্য কাজ করে।


আমার এই দরকার ছিল স্পষ্টতই ggplot2 এর বিকাশ সংস্করণ শ্রেণি-পরীক্ষা-ত্রুটিটিকে এইভাবে সরিয়ে দেয় তবে বর্তমানে CRAN সংস্করণটি (2015-10-21) তা নয়।
ডেভ এক্স

2
এটি আমার জন্য মারেঞ্জগ্রোব নিয়ে কাজ করে তবে অ্যারেঞ্জগ্রোব বা গ্রিড.আরঞ্জের সাথে নয় @ ধন্যবাদ!
13

3

আপনার অ্যারেঞ্জগ্রোব ব্যবহার করার দরকার নেই, আপনি গ্রিডের ফলাফলটি অর্পণ করতে পারেন directly সরাসরি প্লটটিতে সাজান এবং এটি জিএসএসএভি ব্যবহার করে সংরক্ষণ করতে পারেন:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

2

আর একটি সহজ সমাধান: ঠিক আপনার পরে grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

আপনি একটি dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.