Ggplot2 এ কিংবদন্তি আইটেমগুলির মধ্যে ব্যবধান পরিবর্তন করার কোনও উপায় আছে কি?


120

Ggplot2 এ কিংবদন্তি আইটেমগুলির মধ্যে ব্যবধান পরিবর্তন করার কোনও উপায় আছে কি? আমি বর্তমানে আছে

legend.position ="top" 

যা স্বয়ংক্রিয়ভাবে একটি অনুভূমিক কিংবদন্তি তৈরি করে। যাইহোক, আইটেমগুলির ব্যবধান একসাথে খুব কাছাকাছি এবং আমি কীভাবে এগুলি আরও দূরে রাখব তা ভাবছি।


এটির বর্তমান সমাধান optsহ'তে দরকারী হবে যেটি হ্রাস পেয়েছে।
ভূগোলিক

এখানে: পেস্টবিন.
com

3
টুংয়ের উত্তর, বর্তমানে এই থ্রেডের নীচে রয়েছে জুলাই 2018 আপডেট রয়েছে। ত্রুটিগুলি ঠিক করা হয়েছে এবং উপরের পেস্টবিনের মতো হ্যাকি ওয়ার্কেরআউন্ডের আর প্রয়োজন নেই।
প্যাট্রিকটি

উত্তর:


90

ggplot2 v3.0.0জুলাই 2018 এ প্রকাশিতটিতে সংশোধন করার কার্যকর বিকল্প রয়েছে legend.spacing.x, legend.spacing.yএবংlegend.text

উদাহরণ: কিংবদন্তী কীগুলির মধ্যে অনুভূমিক ব্যবধান বাড়ান

library(ggplot2)

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  coord_flip() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(1.0, 'cm'))

দ্রষ্টব্য: আপনি যদি কেবলমাত্র কিংবদন্তির পাঠ্যের ডানদিকে ফাঁকটি প্রসারিত করতে চান তবে ব্যবহার করুন stringr::str_pad()

উদাহরণ: কিংবদন্তি কী লেবেলগুলি নীচে সরান এবং উল্লম্ব ব্যবধান বাড়ান

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  coord_flip() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(1.0, 'cm'),
        legend.text = element_text(margin = margin(t = 10))) +
  guides(fill = guide_legend(title = "Cyl",
                             label.position = "bottom",
                             title.position = "left", title.vjust = 1)) 

উদাহরণ: জন্য scale_fill_xxx&guide_colorbar

ggplot(mtcars, aes(mpg, wt)) +
  geom_point(aes(fill = hp), pch = I(21), size = 5)+
  scale_fill_viridis_c(guide = FALSE) +
  theme_classic(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(0.5, 'cm'),
        legend.text = element_text(margin = margin(t = 10))) +
  guides(fill = guide_colorbar(title = "HP",
                               label.position = "bottom",
                               title.position = "left", title.vjust = 1,
                               # draw border around the legend
                               frame.colour = "black",
                               barwidth = 15,
                               barheight = 1.5)) 


উল্লম্ব কিংবদন্তিগুলির জন্য , সেটিংস legend.key.sizeকেবল কিংবদন্তী কীগুলির আকার বাড়ায়, তাদের মধ্যে উল্লম্ব স্থানটি নয়

ggplot(mtcars) +
  aes(x = cyl, fill = factor(cyl)) +
  geom_bar() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.key.size = unit(1, "cm"))

কিংবদন্তী কীগুলির মধ্যে দূরত্ব বাড়ানোর জন্য, legend-draw.rক্রিয়াকলাপটি পরিবর্তন করা দরকার। আরও তথ্যের জন্য এই সমস্যাটি দেখুন

# function to increase vertical spacing between legend keys
# @clauswilke
draw_key_polygon3 <- function(data, params, size) {
  lwd <- min(data$size, min(size) / 4)

  grid::rectGrob(
    width = grid::unit(0.6, "npc"),
    height = grid::unit(0.6, "npc"),
    gp = grid::gpar(
      col = data$colour,
      fill = alpha(data$fill, data$alpha),
      lty = data$linetype,
      lwd = lwd * .pt,
      linejoin = "mitre"
    ))
}

# register new key drawing function, 
# the effect is global & persistent throughout the R session
GeomBar$draw_key = draw_key_polygon3

ggplot(mtcars) +
  aes(x = cyl, fill = factor(cyl)) +
  geom_bar() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.key = element_rect(color = NA, fill = NA),
        legend.key.size = unit(1.5, "cm")) +
  theme(legend.title.align = 0.5)


3
এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. এটি এমন দুর্দান্ত নতুন বৈশিষ্ট্য, আমি সর্বদা @ ব্যবহারকারী 2568648 এর নোংরা-ফিক্স ব্যবহার করছিলাম, হাহা!
Tjebo

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

69

আমি মনে করি সবচেয়ে ভাল বিকল্পটি এর guide_legendমধ্যে ব্যবহার করা guides:

p + guides(fill=guide_legend(
                 keywidth=0.1,
                 keyheight=0.1,
                 default.unit="inch")
      )

ব্যবহার নোট করুন default.unit, gridপ্যাকেজ লোড করার প্রয়োজন নেই ।


2
এটির আরও বেশি পরিমাণের প্রয়োজন, অন্যান্য উত্তরগুলি পুরানো।
ব্র্যান্ডন বার্টেলসেন

8
এটি অনুভূমিক কিংবদন্তির জন্য কাজ করতে পারে। তবে আমার উল্লম্ব কিংবদন্তির জন্য প্লটের ডানদিকে, এটি কেবল কীগুলির উচ্চতা বৃদ্ধি করে, কীগুলির মধ্যে ব্যবধান নয়। আমার কিংবদন্তি কীগুলি এখনও একে অপরের খুব কাছাকাছি রয়েছে।
মুহসিন জাহিদ উগুর

9
মুশিন যেমন বলেছিলেন, এটি অন্য উত্তরগুলির মতো, বিন্দুটিও মিস করে না, যদি কিংবদন্তিটি ভার্টিকাল হয় তবে এটি কীগুলির মধ্যে স্থান প্যাড না করে কিংবদন্তি কীগুলি (যেমন লাইন বিভাগগুলি) প্রসারিত করে।
প্যাট্রিকটি

জিম_লাইন এবং জিম_পয়েন্টের সাথে একসাথে সুন্দরভাবে কাজ করে।
নীলস হলস্ট

45

আমি একটি সহজ ফিক্স যা আমি অনুভূমিক কিংবদন্তিগুলিতে স্থান যুক্ত করতে, কেবলমাত্র লেবেলে ফাঁকা স্থান যুক্ত করতে (নীচের সূচনা দেখুন):

  scale_fill_manual(values=c("red","blue","white"),
                    labels=c("Label of category 1          ",
                             "Label of category 2          ",
                             "Label of category 3"))

13
এখন পর্যন্ত এটিই একমাত্র উত্তর যা প্রশ্নের সাথে সম্পর্কিত! এটি অনেক এন্ট্রি ক্ষেত্রে সহায়ক হতে পারে: scale_fill_manual(values=values, labels=setNames(paste(labels, " "), entries))
সাসাচাহ

2
প্রযুক্তিগতভাবে খুব সুন্দর নয়, বিশেষত যখন আপনাকে সেই স্পেসগুলি ফ্যাক্টর স্তরের মধ্যে প্রবর্তন করতে হয় তবে এটি কেবলমাত্র কার্যকর সমাধান solution
প্যাট্রিক বুচার

2
অথবা আমরা জীবনকে কিছুটা সহজ করার জন্য str_pad ব্যবহার করতে পারি
টুং

37

এখন এটি প্যাকেজে optsহ্রাস করা হয়েছে ggplot2, themeপরিবর্তে ফাংশনটি ব্যবহার করা উচিত:

library(grid) # for unit()
... + theme(legend.key.height=unit(3,"line"))
... + theme(legend.key.width=unit(3,"line"))

18
এই দ্রবণগুলি বাক্সগুলির মধ্যকার ব্যবধানের বিপরীতে উচ্চতা / প্রস্থকে পরিবর্তন করে।
বার্ক ইউ।

25

কোনও কিংবদন্তীতে এন্ট্রিগুলির মধ্যে ফাঁক যোগ করতে, থিম উপাদানটির মার্জিনগুলি সামঞ্জস্য করুন legend.text

প্রতিটি কিংবদন্তি লেবেলের ডানদিকে 30pt স্পেস যুক্ত করতে (অনুভূমিক কিংবদন্তির জন্য দরকারী হতে পারে):

p + theme(legend.text = element_text(
    margin = margin(r = 30, unit = "pt")))

প্রতিটি কিংবদন্তি লেবেলের বামে 30pt স্পেস যুক্ত করতে (উল্লম্ব কিংবদন্তির জন্য দরকারী হতে পারে):

p + theme(legend.text = element_text(
    margin = margin(l = 30, unit = "pt")))

একটি ggplot2বস্তুর জন্য p। কীওয়ার্ডগুলি হ'ল legend.textএবংmargin

[সম্পাদনা সম্পর্কে দ্রষ্টব্য: যখন এই উত্তরটি প্রথম পোস্ট করা হয়েছিল, তখন একটি বাগ ছিল। বাগটি এখন ঠিক করা হয়েছে]


3
বাগটি এখন ঠিক করা হয়েছে, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
জিওকোমাই

1
এই বিষয়ে জুলাই 2018 আপডেটের জন্য টুংয়ের উত্তরও দেখুন।
প্যাট্রিকটি

17

দেখে মনে হচ্ছে সেরা পদ্ধতির (2018 এ) অবজেক্টের legend.key.sizeঅধীনে ব্যবহার করা theme। (যেমন, এখানে দেখুন )

#Set-up:
    library(ggplot2)
    library(gridExtra)

    gp <- ggplot(data = mtcars, aes(mpg, cyl, colour = factor(cyl))) +
        geom_point()

আপনি যদি ব্যবহার করেন তবে এটি আসল সহজ theme_bw():

  gpbw <- gp + theme_bw()

#Change spacing size:

  g1bw <- gpbw + theme(legend.key.size = unit(0, 'lines'))
  g2bw <- gpbw + theme(legend.key.size = unit(1.5, 'lines'))
  g3bw <- gpbw + theme(legend.key.size = unit(3, 'lines'))

  grid.arrange(g1bw,g2bw,g3bw,nrow=3)

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

তবে এটি অন্যথায় বেশ কার্যকরভাবে কাজ করে না (উদাহরণস্বরূপ, যদি আপনার কিংবদন্তীর প্রতীকটিতে ধূসর ব্যাকগ্রাউন্ডের প্রয়োজন হয়):

  g1 <- gp + theme(legend.key.size = unit(0, 'lines'))
  g2 <- gp + theme(legend.key.size = unit(1.5, 'lines'))
  g3 <- gp + theme(legend.key.size = unit(3, 'lines'))

  grid.arrange(g1,g2,g3,nrow=3)

#Notice that the legend symbol squares get bigger (that's what legend.key.size does). 

#Let's [indirectly] "control" that, too:
  gp2 <- g3
  g4 <- gp2 + theme(legend.key = element_rect(size = 1))
  g5 <- gp2 + theme(legend.key = element_rect(size = 3))
  g6 <- gp2 + theme(legend.key = element_rect(size = 10))

  grid.arrange(g4,g5,g6,nrow=3)   #see picture below, left

লক্ষ্য করুন যে সাদা স্কোয়ারগুলি কিংবদন্তির শিরোনামকে ব্লক করা শুরু করে (এবং অবশেষে গ্রাফটি নিজেই যদি আমরা মান বাড়িয়ে রাখি তবে)।

  #This shows you why:
    gt <- gp2 + theme(legend.key = element_rect(size = 10,color = 'yellow' ))

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

উপরের সমস্যা সমাধানের জন্য আমি প্রায় কোনও কাজের সন্ধান পাইনি ... আপনার যদি ধারণা থাকে তবে মন্তব্যগুলিতে আমাকে জানান, এবং আমি সে অনুযায়ী আপডেট করব!

  • আমি ভাবছি জিনিসগুলি আবার ব্যবহার করার কিছু উপায় আছে যদি $layers...

করুন legend.key: স্বচ্ছtheme(legend.key = element_rect(size = 30,color=alpha("transparent",0)))
ukosteopath

1
ইমো ব্যবহার করা এটি ছিল সবচেয়ে সহজ উত্তর এবং সবচেয়ে সহজ
ব্ল্যাকলাইভসমেটার

14

Ggplot2 এবং তার ব্লগে কোশকের কাজ ( কোশকের ব্লগ ) থেকে

... + theme(legend.key.height=unit(3,"line")) # Change 3 to X
... + theme(legend.key.width=unit(3,"line")) # Change 3 to X

theme_get()অন্যান্য সম্পাদনযোগ্য কিংবদন্তী বৈশিষ্ট্যগুলি দেখতে কনসোলে টাইপ করুন ।


12
পরামর্শ এবং ব্লগের লিঙ্কের জন্য ধন্যবাদ! দুর্ভাগ্যক্রমে তবে এটি বাক্সগুলির আকার পরিবর্তন করবে বলে মনে হচ্ছে তবে আইটেমগুলির মধ্যে ব্যবধান নয়।
ওভারফ্লাউনাম

আপনি এটি কোনও ধরণের ওভারলেয়িং ক্রব দিয়ে "জাল" করতে সক্ষম হতে পারেন। তবে আমি মনে করি না কিংবদন্তির ভিতরে অতিরিক্ত ফাঁকানোর কোনও উপায় আছে। Ggplot2-
ব্র্যান্ডন বার্টেলসেন

2
আমি এটি সফলভাবে কিংবদন্তীর মধ্যে ব্যবধান বাড়ানোর জন্য ব্যবহার করতে পারি। নেতিবাচক সংখ্যা ব্যবহার করে কিংবদন্তির মধ্যে ব্যবধান হ্রাস করতে সহায়তা করে।
নোভা

5

এর যে কোন একটি ব্যবহার করুন

legend.spacing = unit(1,"cm")
legend.spacing.x = unit(1,"cm")
legend.spacing.y = unit(1,"cm")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.