Ggplot2 এ পৃথক দিকের পাঠ্যকে টীকা দেওয়া হচ্ছে


150

আমি নিম্নলিখিত কোডটি দিয়ে প্লটের শেষ দিকের কিছু পাঠ্য বর্নিত করতে চাই:

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ cyl)
p <- p + annotate("text", label = "Test", size = 4, x = 15, y = 5)
print(p)

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

তবে এই কোডটি প্রতিটি দিকের পাঠ্যকে টীকায় দেয়। আপনি যদি কেবলমাত্র একটি দিকটিতে টীকাযুক্ত টেক্সট পেতে কীভাবে আমাকে গাইড করেন তবে আমি অত্যন্ত প্রশংসা করব।


1
আমি বিশ্বাস করি এটি এখনও কার্যকর করা হয়নি , তাই আমার সন্দেহ হয় আপনাকে পাঠ্যের সাহায্যে ডেটা ফ্রেম তৈরির চেষ্টা করা এবং সত্য পদ্ধতি এবং ফেসিং ভেরিয়েবলের জন্য একটি কলাম অবলম্বন করতে হবে suspect
জোরান

উত্তর:


144

সাধারণত আপনি এরকম কিছু করতে চান:

ann_text <- data.frame(mpg = 15,wt = 5,lab = "Text",
                       cyl = factor(8,levels = c("4","6","8")))
p + geom_text(data = ann_text,label = "Text")

এটি সম্পূর্ণরূপে ফ্যাক্টর ভেরিয়েবলটি নির্দিষ্ট না করে কাজ করা উচিত তবে এটি সম্ভবত কিছু সতর্কতা ছুঁড়ে দেবে:

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


2
আমি আমার দৃষ্টিভঙ্গি প্লটটিতে geom_text () ব্যবহার করার চেষ্টা করার পরে আমি কিছু ঝাপসা লেবেলগুলিতে চলে যাব বলে মনে হচ্ছে। এখানে এখানে একই সমস্যাটি আলোচিত হয়েছে (গ্রুপ. google.com/forum/?fromgroups=#!topic/ggplot2/evsbeBT48M4 ) এবং এনেটেট ("পাঠ্য", ...) ব্যবহার করে সমাধান করা হয়েছে। অন্য কেউ কি জিওম টেক্সট () দিয়ে অস্পষ্ট লেবেল পাবে?
মার্গারেট

6
@ মার্গারেট সাধারণত, কারণ আপনি ভুলভাবে জিগপ্লটকে বলেছিলেন যে আপনার মূল ডাটা ফ্রেমে (পয়েন্ট, লাইন ইত্যাদির সাথে থাকা) প্রতিটি সারিটির জন্য প্রতিটি লেবেলের একটি অনুলিপি তৈরি করতে হবে। মনে রাখবেন যে আমি geom_textকেবল একটি সারি দিয়ে একটি পৃথক ডেটা ফ্রেম দিয়েছি ।
joran

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

8
আপনার সমাধানের জন্য ধন্যবাদ। আমি ভাবছি আমিও এটি ব্যবহার করে এটি করতে পারি কিনা annotate()...?
পোলারাইজ করুন

2
@ ব্যবহারকারী 3420448 একই, আপনাকে কেবল প্রতিটি ফেসিং ভেরিয়েবলের জন্য মান নির্দিষ্ট করতে হবে।
জোড়ান

106

এখানে পাঠ্য টীকাবিহীন প্লটটি রয়েছে:

library(ggplot2)

p <- ggplot(mtcars, aes(mpg, wt)) +
  geom_point() +
  facet_grid(. ~ cyl) +
  theme(panel.spacing = unit(1, "lines"))
p

পাঠ্য টীকাবিহীন প্লট

পাঠ্যের টীকাটি ধরে রাখতে অতিরিক্ত ডেটা ফ্রেম তৈরি করা যাক:

dat_text <- data.frame(
  label = c("4 cylinders", "6 cylinders", "8 cylinders"),
  cyl   = c(4, 6, 8)
)
p + geom_text(
  data    = dat_text,
  mapping = aes(x = -Inf, y = -Inf, label = label),
  hjust   = -0.1,
  vjust   = -1
)

প্রান্তে পাঠ্য টীকা সহ প্লট করুন

বিকল্পভাবে, আমরা ম্যানুয়ালি প্রতিটি লেবেলের অবস্থান নির্দিষ্ট করতে পারি:

dat_text <- data.frame(
  label = c("4 cylinders", "6 cylinders", "8 cylinders"),
  cyl   = c(4, 6, 8),
  x     = c(20, 27.5, 25),
  y     = c(4, 4, 4.5)
)

p + geom_text(
  data    = dat_text,
  mapping = aes(x = x, y = y, label = label)
)

ম্যানুয়ালি অবস্থানযুক্ত পাঠ্য লেবেলযুক্ত প্লট করুন

আমরা দুটি দিক জুড়ে প্লটগুলিও লেবেল করতে পারি:

dat_text <- data.frame(
  cyl   = c(4, 6, 8, 4, 6, 8),
  am    = c(0, 0, 0, 1, 1, 1)
)
dat_text$label <- sprintf(
  "%s, %s cylinders",
  ifelse(dat_text$am == 0, "automatic", "manual"),
  dat_text$cyl
)
p +
  facet_grid(am ~ cyl) +
  geom_text(
    size    = 5,
    data    = dat_text,
    mapping = aes(x = Inf, y = Inf, label = label),
    hjust   = 1.05,
    vjust   = 1.5
  )

দুটি ভেরিয়েবল দ্বারা মুখোমুখি

মন্তব্য:

  • আপনি প্যানেলের প্রান্তে পাঠ্য ব্যবহার করতে -Infএবং Infঅবস্থান করতে পারেন ।
  • আপনি ব্যবহার করতে পারেন hjustএবং vjustপাঠ্য সমর্থনযোগ্যতা সামঞ্জস্য করতে।
  • পাঠ্য লেবেল ডেটা ফ্রেমের dat_textএকটি কলাম থাকা উচিত যা আপনার facet_grid()বা এর সাথে কাজ করে facet_wrap()

6
এই উত্তরটি প্রতিটি পদক্ষেপের মধ্য দিয়ে কতটা স্পষ্টভাবে পদক্ষেপের জন্য স্বীকৃত উত্তরের (স্পষ্টতই দুজনের মধ্যে একটি 5 বছরের পার্থক্য) থেকে উচ্চতর। আরও বৃহত্তর স্পষ্টতা এবং ব্যাখ্যা।
ব্র্যান্ডন

1
আপনি যদি একাধিক সারিগুলিতে পাঠ্য যুক্ত করতে চান তবে নিশ্চিত হয়ে নিন যে আপনার colnames()পাঠ্যে data.frameযে ডেটা প্লট করা হচ্ছে তার সাথে মেলে your
কটস

আমি যখন আমার একক দৃষ্টিভঙ্গির জন্য এটি করার চেষ্টা করি, টীকাটি প্রদর্শিত হয় তবে প্রকৃত পয়েন্টগুলি চলে যায় (বা অস্পষ্ট?)।
বেন জি

বেন জি, আপনি নিজের কোড এবং চিত্রটি ভাগ করে নেওয়ার জন্য একটি নতুন পোস্ট করার কথা বিবেচনা করতে পারেন।
কামিল স্লোইকোভস্কি

35

যদি কেউ প্রতিবেদন বা প্রকাশের জন্য দিকগুলি লেবেল করার সহজ উপায় সন্ধান করে তবে egg( সিআরএএন ) প্যাকেজের বেশ নিফটি tag_facet()এবং tag_facet_outside()ফাংশন রয়েছে।

library(ggplot2)

p <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(. ~ am) +
  theme_bw(base_size = 12)

# install.packages('egg', dependencies = TRUE)
library(egg)

ভিতরে ট্যাগ

ডিফল্ট

tag_facet(p)

দ্রষ্টব্য: আপনি যদি স্ট্রিপ পাঠ্য এবং পটভূমি রাখতে চান তবে যুক্ত করার চেষ্টা করুন strip.textএবংstrip.background ফিরে আসুন themeবা theme(strip.text = element_blank(), strip.background = element_blank())মূল tag_facet()ফাংশন থেকে সরিয়ে ফেলুন ।

tag_facet <- function(p, open = "(", close = ")", tag_pool = letters, x = -Inf, y = Inf, 
                      hjust = -0.5, vjust = 1.5, fontface = 2, family = "", ...) {

  gb <- ggplot_build(p)
  lay <- gb$layout$layout
  tags <- cbind(lay, label = paste0(open, tag_pool[lay$PANEL], close), x = x, y = y)
  p + geom_text(data = tags, aes_string(x = "x", y = "y", label = "label"), ..., hjust = hjust, 
                vjust = vjust, fontface = fontface, family = family, inherit.aes = FALSE) 
}

উপরের ডানদিকে প্রান্তিককরণ এবং রোমান সংখ্যা ব্যবহার করুন

tag_facet(p, x = Inf, y = Inf, 
          hjust = 1.5,
          tag_pool = as.roman(1:nlevels(factor(mtcars$am))))

নীচে বাম সারিবদ্ধ করুন এবং মূল অক্ষর ব্যবহার করুন

tag_facet(p, 
          x = -Inf, y = -Inf, 
          vjust = -1,
          open = "", close = ")",
          tag_pool = LETTERS)

আপনার নিজের ট্যাগ সংজ্ঞায়িত করুন

my_tag <- c("i) 4 cylinders", "ii) 6 cyls")
tag_facet(p, 
          x = -Inf, y = -Inf, 
          vjust = -1, hjust = -0.25,
          open = "", close = "",
          fontface = 4,
          size = 5,
          family = "serif",
          tag_pool = my_tag)

বাইরে ট্যাগ

p2 <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(cyl ~ am, switch = 'y') +
  theme_bw(base_size = 12) +
  theme(strip.placement = 'outside')

tag_facet_outside(p2)

সম্পাদনা করুন : স্টিকিলেবেলার প্যাকেজ ব্যবহার করে অন্য একটি বিকল্প যুক্ত করুন

- `.n` numbers the facets numerically: `"1"`, `"2"`, `"3"`...
- `.l` numbers the facets using lowercase letters: `"a"`, `"b"`, `"c"`...
- `.L` numbers the facets using uppercase letters: `"A"`, `"B"`, `"C"`...
- `.r` numbers the facets using lowercase Roman numerals: `"i"`, `"ii"`, `"iii"`...
- `.R` numbers the facets using uppercase Roman numerals: `"I"`, `"II"`, `"III"`...

# devtools::install_github("rensa/stickylabeller")
library(stickylabeller)

ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_wrap(. ~ am, 
             labeller = label_glue('({.l}) am = {am}')) +
  theme_bw(base_size = 12)

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


2
উত্স বলছে "ফেসবুকগুলি লেবেল করার জন্য একটি জিপিপ্লাটে একটি ডামি পাঠ্য স্তর যুক্ত করে এবং ফন্ট স্ট্রিপগুলি ফাঁকাতে সেট করে" "আরগো, যদি আপনি কাস্টম ফেস্ট লেবেল স্ট্রিপগুলি হারাতে চান না তবে স্ক্রিপ্টটি tag_facetনিক্স করে সম্পাদনা করুনstrip.text = element_blank()
ক্রঞ্চি টপিং

@ ক্রঞ্চি টপ্পিং এটি আসলে আমি যে টুপিটি খুঁজছিলাম তা ছিল তবে এটি আমার পক্ষে কাজ করবে বলে মনে হয় না:Warning: Ignoring unknown parameters: strip.text
এফ্রেম

উপরে আমার সমস্যা উত্তর দেওয়ার জন্য ... এই পোস্টে চমত্কারভাবে ব্যাখ্যা রেখাচিত্রমালা রাখা কিভাবে: stackoverflow.com/a/56064130/3609450
efrem

22

আমি মনে করি উপরের উত্তরের জন্য ল্যাব = "পাঠ্য" অকেজো, নীচের কোডটিও ঠিক আছে।

ann_text <- data.frame(mpg = 15,wt = 5,
                       cyl = factor(8,levels = c("4","6","8")))
p + geom_text(data = ann_text,label = "Text" )

তবে আপনি যদি বিভিন্ন সাব-গ্রাফগুলিতে আলাদাভাবে লেবেল করতে চান তবে এটি এইভাবে ঠিক হবে:

ann_text <- data.frame(mpg = c(14,15),wt = c(4,5),lab=c("text1","text2"),
                       cyl = factor(c(6,8),levels = c("4","6","8")))
p + geom_text(data = ann_text,aes(label =lab) )

7
ইতিমধ্যে প্রদত্ত এবং স্বীকৃত উত্তরের তুলনায় আপনার সমাধানটি কী প্রস্তাব দেয় তা আপনাকে গভীরভাবে ব্যাখ্যা করতে হবে।
সাসচা ওল্ফ

3
ধন্যবাদ, এটি বিভিন্ন উপ-গ্রাফ লেবেল করার জন্য দরকারী ছিল।
ডেথকিল 14

কোনও কারণে, যখন আমি এটি করি, এটি সিল = 2 এবং সিল = 3 ফ্যাক্টরগুলির জন্য (খালি) দিকগুলি যুক্ত করে।
ইমুদ্রাক

6

লেবার ডেটাফ্রেম কীভাবে কাজ করে তা পরিষ্কার করতে জোড়ানের দুর্দান্ত উত্তরে কিছুটা প্রসারিত করা।

আপনি যথাক্রমে x এবং y স্থানাঙ্ক হিসাবে "এমপিজি" এবং "ডব্লিউটি" কে ভাবতে পারেন (কামিলেরও উত্তম উত্তরের মত, নাম পরিবর্তন করার পরিবর্তে মূল পরিবর্তনশীল নামগুলি ট্র্যাক করা আমার পক্ষে সহজ মনে হয়েছে)। আপনার প্রতি লেবেলটিতে একটি সারি প্রয়োজন, এবং "সিল" কলামটি দেখায় যে প্রতিটি সারিটির সাথে যুক্ত রয়েছে।

ann_text<-data.frame(mpg=c(25,15),wt=c(3,5),cyl=c(6,8),label=c("Label 1","Label 2"))

ann_text
>  mpg wt cyl  label
>  25  3   6   Label 1
>  15  5   8   Label 2

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ factor(cyl))
p + geom_text(data = ann_text,label=ann_text$label)

লেবেল দিয়ে প্লট করুন


2

আমি eggপ্যাকেজ সম্পর্কে জানতাম না , সুতরাং এখানে একটি সরল ggplot2প্যাকেজ সমাধান রয়েছে

library(tidyverse)
library(magrittr)
Data1=data.frame(A=runif(20, min = 0, max = 100), B=runif(20, min = 0, max = 250), C=runif(20, min = 0, max = 300))
Data2=data.frame(A=runif(20, min = -10, max = 50), B=runif(20, min = -5, max = 150), C=runif(20, min = 5, max = 200))
bind_cols(
Data1 %>% gather("Vars","Data_1"),
Data2 %>% gather("Vars","Data_2")
) %>% select(-Vars1) -> Data_combined
Data_combined %>%
  group_by(Vars) %>%
  summarise(r=cor(Data_1,Data_2),
            r2=r^2,
            p=(pt(abs(r),nrow(.)-2)-pt(-abs(r),nrow(.)-2))) %>%
  mutate(rlabel=paste("r:",format(r,digits=3)),
         plabel=paste("p:",format(p,digits=3))) ->
  label_df 
label_df %<>% mutate(x=60,y=190)
Data_combined %>%
  ggplot(aes(x=Data_1,y=Data_2,color=Vars)) +
  geom_point() + 
  geom_smooth(method="lm",se=FALSE) +
  geom_text(data=label_df,aes(x=x,y=y,label=rlabel),inherit.aes = FALSE) + 
  geom_text(data=label_df,aes(x=x,y=y-10,label=plabel),inherit.aes = FALSE) + 
    facet_wrap(~ Vars)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.