সম্মিলিত ggplots জন্য একটি সাধারণ কিংবদন্তি যুক্ত করুন


138

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

আমার ডেটা দেখে মনে হচ্ছে;

# Data plot 1                                   
        axis1     axis2   
group1 -0.212201  0.358867
group2 -0.279756 -0.126194
group3  0.186860 -0.203273
group4  0.417117 -0.002592
group1 -0.212201  0.358867
group2 -0.279756 -0.126194
group3  0.186860 -0.203273
group4  0.186860 -0.203273

# Data plot 2   
        axis1     axis2
group1  0.211826 -0.306214
group2 -0.072626  0.104988
group3 -0.072626  0.104988
group4 -0.072626  0.104988
group1  0.211826 -0.306214
group2 -0.072626  0.104988
group3 -0.072626  0.104988
group4 -0.072626  0.104988

#And I run this:
library(ggplot2)
library(gridExtra)


groups=c('group1','group2','group3','group4','group1','group2','group3','group4')

x1=data1[,1]
y1=data1[,2]

x2=data2[,1]
y2=data2[,2]

p1=ggplot(data1, aes(x=x1, y=y1,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)

p2=ggplot(data2, aes(x=x2, y=y2,colour=groups)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)

#Combine plots
p3=grid.arrange(
p1 + theme(legend.position="none"), p2+ theme(legend.position="none"), nrow=1, widths = unit(c(10.,10), "cm"), heights = unit(rep(8, 1), "cm")))

কীভাবে আমি এই প্লটগুলির কোনওর থেকে কিংবদন্তিটি বের করব এবং সম্মিলিত প্লটের নীচে / কেন্দ্রে যুক্ত করব?


2
আমার মাঝে মাঝে এই সমস্যা হয়। আপনি যদি প্লটটির মুখোমুখি হতে না চান তবে আমার জানা সবচেয়ে সহজ সমাধানটি হ'ল কোনও কিংবদন্তির সাহায্যে কেবল একটি সংরক্ষণ করা তবে ফটোশপ / ইলাস্ট্রেটরটি ফাঁকা কিংবদন্তি প্লটগুলিতে পেস্ট করতে ব্যবহার করুন। আমি জানি না - তবে ব্যবহারিক দ্রুত এবং সহজ।
স্টিফেন হেন্ডারসন

@ স্টেফেনহেন্ডারসন এটি একটি উত্তর। জিএফএক্স সম্পাদক সহ মুখোমুখি বা পোস্ট-প্রক্রিয়া।
ব্র্যান্ডন বার্টেলসেন

উত্তর:


107

আপডেট 2015-ফেব্রুয়ারি

দেখুন নিচের স্টিভেন এর উত্তর


df1 <- read.table(text="group   x     y   
group1 -0.212201  0.358867
group2 -0.279756 -0.126194
group3  0.186860 -0.203273
group4  0.417117 -0.002592
group1 -0.212201  0.358867
group2 -0.279756 -0.126194
group3  0.186860 -0.203273
group4  0.186860 -0.203273",header=TRUE)

df2 <- read.table(text="group   x     y   
group1  0.211826 -0.306214
group2 -0.072626  0.104988
group3 -0.072626  0.104988
group4 -0.072626  0.104988
group1  0.211826 -0.306214
group2 -0.072626  0.104988
group3 -0.072626  0.104988
group4 -0.072626  0.104988",header=TRUE)


library(ggplot2)
library(gridExtra)

p1 <- ggplot(df1, aes(x=x, y=y,colour=group)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8) + theme(legend.position="bottom")

p2 <- ggplot(df2, aes(x=x, y=y,colour=group)) + geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8)

#extract legend
#https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs
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)

p3 <- grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                         p2 + theme(legend.position="none"),
                         nrow=1),
             mylegend, nrow=2,heights=c(10, 1))

ফলাফলের প্লটটি এখানে: সাধারণ কিংবদন্তি সহ 2 প্লট


2
উভয় উত্তর একই উইকি পৃষ্ঠায় ইঙ্গিত করে যা কোডটি ভাঙ্গার জন্য ggplot2 এর নতুন সংস্করণ হিসাবে আপডেট করা যেতে পারে।
baptiste

ছয় বছরেরও বেশি পরে এই উত্তরটি আমার সমস্যার সমাধান করেছে। ধন্যবাদ!
এসপিকে.জেড

এটি কিছু / বেশিরভাগ লোকের পক্ষে সহজবোধ্য হতে পারে তবে আমি এখনই এটি পেলাম না তাই ভেবেছিলাম আমি মন্তব্য করব। আপনি যদি প্লটের উপরে (নীচের পরিবর্তে) সাধারণ কিংবদন্তি চান তবে আপনার যা করতে হবে তা হল আর্গুমেন্টগুলি স্যুইচ করা। উপরের উদাহরণে, মাইলেজেন্ড আগে যায় arrangeGrob()। আপনাকে উচ্চতাগুলিও বিপরীত করতে হবে (যেমনheights=c(1,10)
ljh2001

113

এছাড়াও আপনি ব্যবহার করতে পারেন ggarrange থেকে ggpubr প্যাকেজ এবং সেট "common.legend ট্রু =":

library(ggpubr)

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
p1 <- qplot(carat, price, data = dsamp, colour = clarity)
p2 <- qplot(cut, price, data = dsamp, colour = clarity)
p3 <- qplot(color, price, data = dsamp, colour = clarity)
p4 <- qplot(depth, price, data = dsamp, colour = clarity) 

ggarrange(p1, p2, p3, p4, ncol=2, nrow=2, common.legend = TRUE, legend="bottom")

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


1
এটি কি সম্ভব যে রেন্ডারপ্লট () এর সাথে একটি চকচকে অ্যাপ্লিকেশন (বা ফ্লেক্সড্যাশবোর্ড) এর ভিতরে এটি কাজ করে না? এটি সাধারণ প্লটের সাথে একটি সাধারণ আর স্ক্রিপ্টে পুরোপুরি সূক্ষ্মভাবে কাজ করে। কিন্তু যখন আমি আমার ফ্লেক্সড্যাশবোর্ডে রেন্ডারপ্লট () দিয়ে তৈরি প্লটগুলি দিয়ে ঠিক একই জিনিসটি করি তখন কিছুই উপস্থিত হয় না।
টিংলফিন

1
এর জন্য আপনাকে ধন্যবাদ - আমি মনে করি এটি যা
দেখছিলাম

এটা সত্যিই দারুন! ধন্যবাদ!
ইয়ানস

@ টিংলফিন আমাকে যখন কখনও কখনও অন্য কোনও ফাংশন দ্বারা প্লট করার দরকার পড়েছিল তখন আমার কোনও print(ggarrangeobject)একটি ggarrangeবস্তুর চারপাশে গুটিয়ে ফেলতে হয়েছিল, এটি আপনার সমাধানের সাথে মিলে যায় renderPlot()?
ব্র্যান্ডন

common.legend = TRUEআমার যা দরকার!
আর্যো

62

রোল্যান্ডের উত্তরটির আপডেট হওয়া দরকার। দেখুন: https://github.com/hadley/ggplot2/wiki/Share-a-legnd-between-two-ggplot2- অনুচ্ছেদ

এই পদ্ধতিটি ggplot2 v1.0.0 এর জন্য আপডেট করা হয়েছে।

library(ggplot2)
library(gridExtra)
library(grid)


grid_arrange_shared_legend <- function(...) {
    plots <- list(...)
    g <- ggplotGrob(plots[[1]] + theme(legend.position="bottom"))$grobs
    legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
    lheight <- sum(legend$height)
    grid.arrange(
        do.call(arrangeGrob, lapply(plots, function(x)
            x + theme(legend.position="none"))),
        legend,
        ncol = 1,
        heights = unit.c(unit(1, "npc") - lheight, lheight))
}

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(cut, price, data=dsamp, colour=clarity)
p3 <- qplot(color, price, data=dsamp, colour=clarity)
p4 <- qplot(depth, price, data=dsamp, colour=clarity)
grid_arrange_shared_legend(p1, p2, p3, p4)

অভাব নোট করুন ggplot_gtableএবং ggplot_buildggplotGrobপরিবর্তে ব্যবহৃত হয়। এই উদাহরণটি উপরের সমাধানের চেয়ে কিছুটা বিশৃঙ্খলাযুক্ত তবে এটি এখনও আমার জন্য এটি সমাধান করেছে।


10
হাই, আমার কাছে 6 টি প্লট আছে এবং আমি 6 প্লটগুলিকে 2 সারি × 3 কর্ন হিসাবে সাজিয়ে তুলতে চাই এবং শীর্ষে কিংবদন্তিটি আঁকতে পারি, তবে কীভাবে ফাংশন পরিবর্তন করবেন grid_arrange_shared_legend? ধন্যবাদ!
just_rookie

4
@just_rookie আপনি কীভাবে কোনও ফাংশন পরিবর্তন করবেন এমন কোনও সমাধান খুঁজে পেয়েছেন যাতে কেবলমাত্র পরিবর্তে আলাদা আলাদা এনসিওল এবং নরো বিন্যাস ব্যবহার করা যায় ncol = 1?
জিউসেপ

হাই, আমি এই সমাধানটি চেষ্টা করেছি, এটি ভাল কাজ করে, তবে এটি প্রিন্ট করার সময় আমি কেবল 1 এর পরিবর্তে 2 পিডিএফ পৃষ্ঠাগুলি পেয়েছি, প্রথমটি ফাঁকা এবং পরে আমার প্লট রয়েছে, কেন আমি এ জাতীয় আচরণ পেয়েছি? ধন্যবাদ,
HanniBaL90

: যেকেউ কিভাবে আমার মতোই Isse পান, এখানে কার্যসংক্রান্ত নেই stackoverflow.com/questions/12481267/...
HanniBaL90

1
দুর্দান্ত জিনিস এখানে। কোনও প্লট কীভাবে সমস্ত প্লটের জন্য একটি একক শিরোনাম যুক্ত করতে পারে?
পার্টিনেক্স

27

একটি নতুন, আকর্ষণীয় সমাধান ব্যবহার করা হয় patchwork। বাক্য গঠনটি খুব সহজ:

library(ggplot2)
library(patchwork)

p1 <- ggplot(df1, aes(x = x, y = y, colour = group)) + 
  geom_point(position = position_jitter(w = 0.04, h = 0.02), size = 1.8)
p2 <- ggplot(df2, aes(x = x, y = y, colour = group)) + 
  geom_point(position = position_jitter(w = 0.04, h = 0.02), size = 1.8)

combined <- p1 + p2 & theme(legend.position = "bottom")
combined + plot_layout(guides = "collect")

2019-12-13 এ ডিপেক্স প্যাকেজ (v0.2.1) দ্বারা নির্মিত


2
আপনি যদি আদেশের combined <- p1 + p2 + plot_layout(guides = "collect") & theme(legend.position = "bottom")
ক্রমটি

17

আমি কাউপ্লট ব্যবহার করার পরামর্শ দিচ্ছি। তাদের আর ভিগনেট থেকে :

# load cowplot
library(cowplot)

# down-sampled diamonds data set
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]

# Make three plots.
# We set left and right margins to 0 to remove unnecessary spacing in the
# final plot arrangement.
p1 <- qplot(carat, price, data=dsamp, colour=clarity) +
   theme(plot.margin = unit(c(6,0,6,0), "pt"))
p2 <- qplot(depth, price, data=dsamp, colour=clarity) +
   theme(plot.margin = unit(c(6,0,6,0), "pt")) + ylab("")
p3 <- qplot(color, price, data=dsamp, colour=clarity) +
   theme(plot.margin = unit(c(6,0,6,0), "pt")) + ylab("")

# arrange the three plots in a single row
prow <- plot_grid( p1 + theme(legend.position="none"),
           p2 + theme(legend.position="none"),
           p3 + theme(legend.position="none"),
           align = 'vh',
           labels = c("A", "B", "C"),
           hjust = -1,
           nrow = 1
           )

# extract the legend from one of the plots
# (clearly the whole thing only makes sense if all plots
# have the same legend, so we can arbitrarily pick one.)
legend_b <- get_legend(p1 + theme(legend.position="bottom"))

# add the legend underneath the row we made earlier. Give it 10% of the height
# of one plot (via rel_heights).
p <- plot_grid( prow, legend_b, ncol = 1, rel_heights = c(1, .2))
p

নীচে কিংবদন্তি সঙ্গে মিলিত প্লট


এটি ছিল একমাত্র উপায়, যা একটি কিংবদন্তি_বি () ব্যবহার করে আমার চক্রান্তে একটি ম্যানুয়াল কিংবদন্তি স্থাপনের সম্ভাব্যকে চিহ্নিত করেছে annotate_figure(ggarrange())আপনাকে অনেক ধন্যবাদ, godশ্বর তোমাকে দোয়া করুন!
জিন কার্লোস

12

@ জিউসেপ, আপনি প্লট বিন্যাসের নমনীয় স্পেসিফিকেশন ( এখান থেকে সংশোধিত ) জন্য এটি বিবেচনা করতে পারেন :

library(ggplot2)
library(gridExtra)
library(grid)

grid_arrange_shared_legend <- function(..., nrow = 1, ncol = length(list(...)), position = c("bottom", "right")) {

  plots <- list(...)
  position <- match.arg(position)
  g <- ggplotGrob(plots[[1]] + theme(legend.position = position))$grobs
  legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
  lheight <- sum(legend$height)
  lwidth <- sum(legend$width)
  gl <- lapply(plots, function(x) x + theme(legend.position = "none"))
  gl <- c(gl, nrow = nrow, ncol = ncol)

  combined <- switch(position,
                     "bottom" = arrangeGrob(do.call(arrangeGrob, gl),
                                            legend,
                                            ncol = 1,
                                            heights = unit.c(unit(1, "npc") - lheight, lheight)),
                     "right" = arrangeGrob(do.call(arrangeGrob, gl),
                                           legend,
                                           ncol = 2,
                                           widths = unit.c(unit(1, "npc") - lwidth, lwidth)))
  grid.newpage()
  grid.draw(combined)

}

অতিরিক্ত যুক্তি nrowএবং ncolসাজানো প্লটগুলির বিন্যাস নিয়ন্ত্রণ করুন:

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
p1 <- qplot(carat, price, data = dsamp, colour = clarity)
p2 <- qplot(cut, price, data = dsamp, colour = clarity)
p3 <- qplot(color, price, data = dsamp, colour = clarity)
p4 <- qplot(depth, price, data = dsamp, colour = clarity)
grid_arrange_shared_legend(p1, p2, p3, p4, nrow = 1, ncol = 4)
grid_arrange_shared_legend(p1, p2, p3, p4, nrow = 2, ncol = 2)

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


অন্যান্য সমাধান হিসাবে একই, আমি এটি চেষ্টা করেছিলাম, এটি ভাল কাজ করে, তবে এটি প্রিন্ট করার সময়, আমি কেবল 1 এর পরিবর্তে 2 পিডিএফ পৃষ্ঠাগুলি পেয়েছি, প্রথমটি ফাঁকা এবং পরে আমার প্লট রয়েছে, কেন আমি এই জাতীয় আচরণ পেয়েছিলাম? ধন্যবাদ,
HanniBaL90

: যেকেউ কিভাবে আমার মতোই Isse পান, এখানে কার্যসংক্রান্ত নেই stackoverflow.com/questions/12481267/...
HanniBaL90

কেউ আমাকে সমাধান ব্যাখ্যা করতে পারেন? আইয়া কীভাবে নীচের পরিবর্তে শীর্ষে কিংবদন্তি স্থাপন করতে পারে? ধন্যবাদ
HanniBaL90

8

যদি আপনি উভয় প্লটে একই ভেরিয়েবল প্লট করে থাকেন, তবে সবচেয়ে সহজ উপায় হ'ল ডেটা ফ্রেমগুলিকে একের সাথে একত্রিত করা, তারপরে ফেস_আরপ ব্যবহার করুন।

আপনার উদাহরণের জন্য:

big_df <- rbind(df1,df2)

big_df <- data.frame(big_df,Df = rep(c("df1","df2"),
times=c(nrow(df1),nrow(df2))))

ggplot(big_df,aes(x=x, y=y,colour=group)) 
+ geom_point(position=position_jitter(w=0.04,h=0.02),size=1.8) 
+ facet_wrap(~Df)

প্লট 1

হীরার ডেটা সেট ব্যবহার করে আরেকটি উদাহরণ। এটি দেখায় যে আপনার প্লটের মধ্যে যদি কেবল একটি পরিবর্তনশীল সাধারণ থাকে তবে আপনি এটিকে কাজ করতেও সক্ষম করতে পারেন।

diamonds_reshaped <- data.frame(price = diamonds$price,
independent.variable = c(diamonds$carat,diamonds$cut,diamonds$color,diamonds$depth),
Clarity = rep(diamonds$clarity,times=4),
Variable.name = rep(c("Carat","Cut","Color","Depth"),each=nrow(diamonds)))

ggplot(diamonds_reshaped,aes(independent.variable,price,colour=Clarity)) + 
geom_point(size=2) + facet_wrap(~Variable.name,scales="free_x") + 
xlab("")

প্লট 2

দ্বিতীয় উদাহরণের সাথে কেবল জটিল জিনিস হ'ল আপনি যখন সমস্ত তথ্যকে একটি ডেটা ফ্রেমে একত্রিত করেন তখন ফ্যাক্টর ভেরিয়েবলগুলি সংখ্যায় জোর হয়। সুতরাং আদর্শভাবে, আপনি যখন মূলত আপনার আগ্রহের সমস্ত ভেরিয়েবল একই ধরণের হয় তখন আপনি এটি করবেন।


1

@Guiseppe:

গ্রোবস ইত্যাদি সম্পর্কে আমার কোনও ধারণা নেই, তবে আমি দুটি প্লটের জন্য একটি সমাধান হ্যাক করেছি, স্বেচ্ছাসেবী সংখ্যায় প্রসারিত করা সম্ভব হবে তবে এটি কোনও সেক্সি ফাংশনে নয়:

plots <- list(p1, p2)
g <- ggplotGrob(plots[[1]] + theme(legend.position="bottom"))$grobs
legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
lheight <- sum(legend$height)
tmp <- arrangeGrob(p1 + theme(legend.position = "none"), p2 + theme(legend.position = "none"), layout_matrix = matrix(c(1, 2), nrow = 1))
grid.arrange(tmp, legend, ncol = 1, heights = unit.c(unit(1, "npc") - lheight, lheight))

1

কিংবদন্তি যদি উভয় প্লটের জন্য একই হয় তবে একটি সহজ সমাধান ব্যবহার করে grid.arrange(ধরে নিচ্ছেন যে আপনি আপনার কিংবদন্তিকে উভয় প্লটের সাথে উল্লম্ব বা অনুভূমিকভাবে প্রান্তিককরণ করতে চান)। অন্যটির জন্য কিংবদন্তি বাদ দিলে কেবল নীচের অংশে বা ডান-সর্বাধিক প্লটের জন্য কিংবদন্তি রাখুন। কেবল একটি প্লটে একটি কিংবদন্তি যুক্ত করা, তবে অন্য প্লটের সাথে সম্পর্কিত একটি প্লটের আকারকে পরিবর্তিত করে। এটি এড়াতে heightsকমান্ডটি ম্যানুয়ালি সামঞ্জস্য করুন এবং তাদের একই আকার রাখুন। আপনি grid.arrangeসাধারণ অক্ষের শিরোনাম তৈরি করতেও ব্যবহার করতে পারেন। নোট করুন যে এটি library(grid)ছাড়াও প্রয়োজন হবে library(gridExtra)। উল্লম্ব প্লটের জন্য:

y_title <- expression(paste(italic("E. coli"), " (CFU/100mL)"))

grid.arrange(arrangeGrob(p1, theme(legend.position="none"), ncol=1), arrangeGrob(p2, theme(legend.position="bottom"), ncol=1), heights=c(1,1.2), left=textGrob(y_title, rot=90, gp=gpar(fontsize=20)))

আমি যে প্রকল্পে কাজ করছিলাম তার অনুরূপ গ্রাফের ফলাফল এখানে রয়েছে: এখানে চিত্র বর্ণনা লিখুন

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