দুটি গ্রাফ প্রান্ত বামদিকে প্রান্তিক করুন (ggplot)


105

আমি জিজিপ্লট ব্যবহার করছি এবং দুটি গ্রাফ রয়েছে যা আমি একে অপরের শীর্ষে প্রদর্শন করতে চাই। আমি grid.arrangeগ্রিডেক্সট্রা থেকে তাদের স্ট্যাক করার জন্য ব্যবহার করেছি। সমস্যাটি হ'ল আমি চাই গ্রাফের বাম প্রান্তটি অক্ষর লেবেল নির্বিশেষে ডান প্রান্তগুলি পাশাপাশি প্রান্তিককরণ করতে চাই। (সমস্যা দেখা দেয় কারণ একটি গ্রাফের লেবেলগুলি ছোট এবং অন্যটি দীর্ঘ হয়) is

প্রশ্ন:
আমি কীভাবে এটি করতে পারি? আমি গ্রিড.আরঞ্জের সাথে বিবাহিত নই তবে জিজিপ্লট 2 অবশ্যই আবশ্যক।

আমি যা চেষ্টা করেছি:
আমি 2 x 2 গ্রিড তৈরি করতে এবং প্রস্থ এবং উল্টো কোণগুলিতে ভিজ্যুয়াল রাখার জন্য প্রস্থ এবং উচ্চতা পাশাপাশি এনসিওল এবং নরো দিয়ে খেলার চেষ্টা করেছি এবং বিপরীত কোণগুলিতে আমি ভিজ্যুয়ালগুলি পাই না ।

require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
grid.arrange(A, B, ncol=1)

এখানে চিত্র বর্ণনা লিখুন


2
এখানে দুটি সম্ভাব্য বিকল্প রয়েছে: এখানে এবং এখানে
12 এ জোড়ান

@ জোড়ান আমি বাম অক্ষটি সারিবদ্ধ হওয়ার জন্য খুঁজছি আমি মনে করি না এটি এগুলি করবে। আমি যদিও ভুল হতে চাই।
টাইলার রিঙ্কার

উত্তর:


132

এটা চেষ্টা কর,

 gA <- ggplotGrob(A)
 gB <- ggplotGrob(B)
 maxWidth = grid::unit.pmax(gA$widths[2:5], gB$widths[2:5])
 gA$widths[2:5] <- as.list(maxWidth)
 gB$widths[2:5] <- as.list(maxWidth)
 grid.arrange(gA, gB, ncol=1)

সম্পাদন করা

rbind.gtableঅন্তর্ভুক্তটির পরিবর্তিত সংস্করণ ব্যবহার করে এখানে আরও একটি সাধারণ সমাধান (যেকোন সংখ্যক প্লটের সাথে কাজ করে)'sgridExtra

gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
grid::grid.newpage()
grid::grid.draw(rbind(gA, gB))

3
সুন্দর এবং সত্যিই বেশ সোজা এগিয়ে। সমাধানের জন্য আপনাকে ধন্যবাদ।
টাইলার রিঙ্কার

1
নিখুঁত সমাধান! আমি একাধিক পৃথক পৃথক সময়-সিরিজ প্লটগুলি সারিবদ্ধ করার জন্য এই জাতীয় কিছু সন্ধান করছি যা প্রতিটি প্লটের মূল কাস্টমাইজেশনের কারণে আমি মুখোমুখি করতে পারি না।
ওয়াহালুলু

আপনি কি আমাদের সাথে দুটি কলাম থাকলে উচ্চতার সাথে ম্যাচের উপায়টি সরবরাহ করতে এত দয়া করবেন? gA $ উচ্চতা [2: 3] কাজ করছে বলে মনে হয় না। আমাকে কি গ্রাবের 2: 3 এর চেয়ে আরও একটি উপাদান নির্বাচন করতে হবে? ধন্যবাদ!
এটিয়েন লো-ডিকারি

4
আপনার সমাধান ব্যাপটিস্টের জন্য আপনাকে ধন্যবাদ। যাইহোক, আমি যখন প্লটগুলির মধ্যে একটি হয় তখন এটি কাজ করতে পাই না tableGrobgtable::cbindআমাকে একটা হতাশাজনক ত্রুটি দেয়: nrow(x) == nrow(y) is not TRUE। কোনও পরামর্শ?
গাবরা

2
এই সমাধানটি আমার পক্ষে কাজ করেছে, আমি এটি বোঝার চেষ্টা করছি। কী [2:5]দাঁড়ায়?
হুরলিকাস

38

আমি যেকোন সংখ্যক প্লটের জন্য এটি সাধারণ করতে চেয়েছিলাম wanted ব্যাপটিস্টের পদ্ধতিটি ব্যবহার করে এখানে একটি ধাপে ধাপে সমাধান দেওয়া হয়েছে:

plots <- list(A, B, C, D)
grobs <- list()
widths <- list()

প্রতিটি প্লটের প্রতিটি গ্রাবের জন্য প্রস্থ সংগ্রহ করুন

for (i in 1:length(plots)){
    grobs[[i]] <- ggplotGrob(plots[[i]])
    widths[[i]] <- grobs[[i]]$widths[2:5]
}

সর্বোচ্চ প্রস্থ পেতে do.call ব্যবহার করুন

maxwidth <- do.call(grid::unit.pmax, widths)

প্রতিটি ছাঁকুনিতে সর্বোচ্চ প্রস্থকে স্বাক্ষর করুন

for (i in 1:length(grobs)){
     grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}

পটভূমি

do.call("grid.arrange", c(grobs, ncol = 1))

2
প্লটগুলির বিভিন্ন প্রস্থের কিংবদন্তী থাকা সত্ত্বেও কাজ করে - খুব সুন্দর!
কিথ হুগিট

30

কাউপ্লট প্যাকেজ ব্যবহার :

A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 

library(cowplot)
plot_grid(A, B, ncol=1, align="v")

এখানে চিত্র বর্ণনা লিখুন


12

উপর http://rpubs.com/MarkusLoew/13295 সত্যিই একটি সহজ সমাধান উপলব্ধ (শেষ আইটেম) এই সমস্যা প্রয়োগ করা হয়:

require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
grid.draw(rbind(ggplotGrob(A), ggplotGrob(B), size="first"))

আপনি প্রস্থ এবং উচ্চতা উভয়ের জন্যও এটি ব্যবহার করতে পারেন:

require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
C <- ggplot(CO2, aes(x=conc)) + geom_bar() +coord_flip()
D <- ggplot(CO2, aes(x=uptake)) + geom_bar() +coord_flip() 
grid.draw(cbind(
            rbind(ggplotGrob(A), ggplotGrob(B), size="first"),
            rbind(ggplotGrob(C), ggplotGrob(D), size="first"),
            size='first'))

2
ব্যবহারের size="first"অর্থ হ'ল দ্বিতীয় চক্রান্তটি যদি প্রথমের চেয়ে বড় হয় তবে প্রান্তিককরণটি খুব ভাল লাগবে না
ব্যাপটিস্ট

10

eggপ্যাকেজ গোপন ggplot একটি প্রমিত মধ্যে বস্তু 3x3gtable, facetted বেশী সহ নির্বিচারে ggplots মধ্যে চক্রান্ত প্যানেল প্রান্তিককরণ সক্রিয়।

library(egg) # devtools::install_github('baptiste/egg')
library(ggplot2)

p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() 

p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() + facet_wrap( ~ cyl, ncol=2, scales = "free") +
  guides(colour="none") +
  theme()

ggarrange(p1, p2)

এখানে চিত্র বর্ণনা লিখুন


আমার জন্য এটি সঠিকভাবে অনুভূমিকভাবে একটি সহজ হিটম্যাপ ( geom_tile) নীচে লেজেন্ড এবং একটি বহুমুখী হিটম্যাপ ( facet_gridসহ geom_tile) ব্যবস্থা করতে পারে তবে তৃতীয় প্লটের উচ্চতা সারিবদ্ধ করতে ব্যর্থ হয়েছিল, যা ছিল একটি ডেনড্রগ্রাম ( geom_segment)। যাইহোক, কাউপ্লট বা gridExtra::grid.arrangeএমনকি প্রাক্তনটিও করতে সক্ষম ছিলেন না, তাই এটি এখন পর্যন্ত সবচেয়ে ভাল কাজ করে
ডেনিস

8

meltপুনরায় আকার 2 প্যাকেজটি ব্যবহার করে এখানে আরও একটি সম্ভাব্য সমাধান রয়েছে facet_wrap:

library(ggplot2)
library(reshape2)

dat = CO2[, c(1, 2)]
dat$id = seq(nrow(dat))
mdat = melt(dat, id.vars="id")

head(mdat)
#   id variable value
# 1  1    Plant   Qn1
# 2  2    Plant   Qn1
# 3  3    Plant   Qn1
# 4  4    Plant   Qn1
# 5  5    Plant   Qn1
# 6  6    Plant   Qn1

plot_1 = ggplot(mdat, aes(x=value)) + 
         geom_bar() + 
         coord_flip() +
         facet_wrap(~ variable, nrow=2, scales="free", drop=TRUE)

ggsave(plot=plot_1, filename="plot_1.png", height=4, width=6)

এখানে চিত্র বর্ণনা লিখুন


এই সমাধানটি ধরে নিয়েছে যে প্রতিটি কলামে আপনার সমান সংখ্যক সারি রয়েছে। আমার এমআরডব্লিউইতে এটি সত্য তবে বাস্তবে নয়।
টাইলার রিঙ্কার

আমি নিশ্চিত যে আমি বুঝতে পেরেছি না: আপনি কি বোঝাচ্ছেন যে CO2 $ উদ্ভিদ এবং সিও 2 $ টাইপ একই দৈর্ঘ্য হিসাবে দেখা যায়, তবে আপনার প্রকৃত ডেটা এর মতো নয়?
bdemarest

এটি দুটি পৃথক ডেটা সেট যা একটি ভেরিয়েবল ভাগ করে তাই সারি সংখ্যা এক নয়।
টাইলার রিঙ্কার



-1

আমি জানি এটি একটি পুরানো পোস্ট, এবং এর উত্তর ইতিমধ্যে দেওয়া হয়েছে, তবে আমি @ বাপটিস্টের পদ্ধতির সাথে আরও purrrসুন্দর দেখতে এটির সমন্বয় করার পরামর্শ দিতে পারি :

library(purrr)
list(A, B) %>% 
  map(ggplotGrob) %>% 
  do.call(gridExtra::gtable_rbind, .) %>% 
  grid::grid.draw()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.