আলফা নান্দনিক প্লেইন আকৃতির পরিবর্তে তীরের কঙ্কাল দেখায় - কীভাবে এটি প্রতিরোধ করবেন?


11

আমি বারের শেষে তীর দিয়ে একটি বার প্লট তৈরির লক্ষ করছি। আমি সংজ্ঞায়িত geom_segmentসঙ্গে গিয়েছিলাম arrow। আমি স্বচ্ছতার উপরে একটি কলাম মানচিত্র করতে চাই, তবে আলফা নান্দনিকটি তীরের বস্তু দিয়ে ভাল কাজ করবে বলে মনে হচ্ছে না। কোড স্নিপেট এখানে:

tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>% 
  ggplot() + geom_segment(aes(x = 0, xend = n, y = y, yend = y, alpha = transparency), 
                          colour = 'red', size = 10, arrow = arrow(length = unit(1.5, 'cm'), type = 'closed')) +
  scale_y_continuous(limits = c(5, 35))

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

এটি সহজেই লক্ষ্য করা যায় যে arrowঅবজেক্টটি স্বল্প alpha, স্বচ্ছ আকৃতির পরিবর্তে এর কঙ্কালটি দেখায় এর নিম্ন মানের সাথে ভাল দেখাচ্ছে না। এটি রোধ করার কোনও উপায় আছে?


আকর্ষণীয় পর্যবেক্ষণ - আমি কেবলমাত্র ছোট প্রস্থের সাথে একটি পৃথক বিভাগ আঁকার মতো কিছু কাজের কথা ভাবতে পারি, যেমন:tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>% ggplot() + geom_segment(aes(x = 0, xend = n-10, y = y, yend = y, alpha = transparency), colour = 'red', size = 10) + geom_segment(aes(x = n-0.1, xend = n, y = y, yend = y, alpha = transparency), colour = 'red', size = 1, arrow = arrow(length = unit(1.5, 'cm'), type = 'closed')) + scale_y_continuous(limits = c(5, 35))
ওল্ফগ্যাং আর্নল্ড

এটা সত্যিই আকর্ষণীয়। আমার ধারণা, ওভারল্যাপিং "কঙ্কাল" এর সঠিক ক্ষেত্রটি গণনা করা এবং প্রতিটি অঞ্চলের জন্য প্রোগ্রামালিকভাবে আলফা সেট করা (এটি একটি ভয়ঙ্কর হ্যাক হবে) এড়াতে এড়ানো যায় না। আপনি যদি সত্যিই স্বচ্ছ তীর চান, তবে অন্য একটি পদ্ধতির অংশটি হবে 1) বিভাগটি এবং 2) এটির সাথে একটি ত্রিভুজ সংলগ্ন। (এটিও আমার কাছে বেশ হ্যাকের মতো মনে হয়)।
Tjbo

2
আপনি অবশ্যই ঠিক বলেছেন যে তীরগুলির জন্য সমতল স্বচ্ছতা থাকা ভাল হবে be আমি বিশ্বাস করি যে এটি জিপিপ্লাটের শেষের কোনও আচরণের কারণে নয় তবে 'গ্রিড' প্যাকেজটি কীভাবে তীরগুলি আঁকবে (যার উপর জিজিপ্লট 2 নির্ভর করে) এর সাথে সম্পর্কিত বলে মনে হচ্ছে।
teunbrand

উত্তর:


13

আমরা একটি নতুন জিওম তৈরি করতে পারি geom_arrowbar, যেটি আমরা অন্য যে কোনও রত্নের মতো ব্যবহার করতে পারি, সুতরাং আপনার ক্ষেত্রে এটি কেবলমাত্র করে কাঙ্ক্ষিত প্লটটি দেবে:

tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>%
  ggplot() +
  geom_arrowbar(aes(x = n, y = y, alpha = transparency), fill = "red") +
  scale_y_continuous(limits = c(5, 35)) +
  scale_x_continuous(limits = c(0, 350))

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

এবং এটা 3 পরামিতি রয়েছে column_width, head_widthএবং head_lengthযে আপনার তীর আকৃতি পরিবর্তন করতে আপনি অক্ষমতা পছন্দ না অনুমতি দেয়। প্রয়োজন অনুযায়ী আমরা ফিল রঙ এবং অন্যান্য নান্দনিকতাও নির্দিষ্ট করতে পারি:

tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>%
  ggplot() +
  geom_arrowbar(aes(x = n, y = y, alpha = transparency, fill = as.factor(n)),
                column_width = 1.8, head_width = 1.8, colour = "black") +
  scale_y_continuous(limits = c(5, 35)) +
  scale_x_continuous(limits = c(0, 350))

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

একমাত্র ছিনতাই হচ্ছে আমাদের প্রথমে এটি লিখতে হবে!

এক্সটেন্ডিং ggplot2 ভিগনেটের উদাহরণ অনুসরণ করে , আমরা আমাদের geom_arrowbarতাত্ক্ষণিকভাবে যেভাবে 3 টি প্যারামিটারগুলিতে তীরের আকারটি নিয়ন্ত্রণ করতে সক্ষম হতে চাই তা বাদ দিয়ে অন্য রত্নগুলি যেমন নির্ধারিত হয় সেভাবে আমাদের সংজ্ঞা দিতে পারি। এগুলি paramsফলাফল layerঅবজেক্টের তালিকায় যুক্ত হয় , যা আমাদের তীর স্তর তৈরি করতে ব্যবহৃত হবে:

library(tidyverse)

geom_arrowbar <- function(mapping = NULL, data = NULL, stat = "identity",
                          position = "identity", na.rm = FALSE, show.legend = NA,
                          inherit.aes = TRUE, head_width = 1, column_width = 1,
                          head_length = 1, ...) 
{
  layer(geom = GeomArrowBar, mapping = mapping, data = data, stat = stat,
        position = position, show.legend = show.legend, inherit.aes = inherit.aes,
        params = list(na.rm = na.rm, head_width = head_width,
                      column_width = column_width, head_length = head_length, ...))
}

এখন "সমস্ত" যা আছে তা নির্ধারণ GeomArrowBarকরা। এটি কার্যকরভাবে একটি ggprotoবর্গ সংজ্ঞা। এর সর্বাধিক গুরুত্বপূর্ণ অংশটি হ'ল draw_panelসদস্য ফাংশন, যা আমাদের ডাটাফ্রেমের প্রতিটি লাইন নিয়ে যায় এবং এটিকে তীর আকারে রূপান্তর করে। এক্স এবং ওয়াই কো-অর্ডিনেটের পাশাপাশি তীরের আকারটি কী হওয়া উচিত তা আমাদের বিভিন্ন আকারের পরামিতিগুলি থেকে কিছু প্রাথমিক গণিতের কাজ করার পরে এটি grid::polygonGrobআমাদের ডেটার প্রতিটি লাইনের জন্য একটি তৈরি করে এবং এটি একটিতে সঞ্চয় করে gTree। এটি স্তরটির গ্রাফিকাল উপাদান গঠন করে।

GeomArrowBar <- ggproto("GeomArrowBar", Geom,
  required_aes = c("x", "y"),
  default_aes = aes(colour = NA, fill = "grey20", size = 0.5, linetype = 1, alpha = 1),
  extra_params = c("na.rm", "head_width", "column_width", "head_length"),
  draw_key = draw_key_polygon,
  draw_panel = function(data, panel_params, coord, head_width = 1,
                        column_width = 1, head_length = 1) {
    hwidth <- head_width / 5
    wid <- column_width / 10
    len <- head_length / 10
    data2 <- data
    data2$x[1] <- data2$y[1] <- 0
    zero <- coord$transform(data2, panel_params)$x[1]
    coords <- coord$transform(data, panel_params)
    make_arrow_y <- function(y, wid, hwidth) {
      c(y - wid/2, y - wid/2, y - hwidth/2, y, y + hwidth/2, y + wid/2, y + wid/2)
    }
    make_arrow_x <- function(x, len){
      if(x < zero) len <- -len
      return(c(zero, x - len, x - len , x, x - len, x - len, zero))
    }
    my_tree <- grid::gTree()
    for(i in seq(nrow(coords))){
      my_tree <- grid::addGrob(my_tree, grid::polygonGrob(
        make_arrow_x(coords$x[i], len),
        make_arrow_y(coords$y[i], wid, hwidth),
        default.units = "native",
        gp = grid::gpar(
          col = coords$colour[i],
          fill = scales::alpha(coords$fill[i], coords$alpha[i]),
          lwd = coords$size[i] * .pt,
          lty = coords$linetype[i]))) }
    my_tree}
)

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

সংক্ষেপে, এগুলি (এবং অন্যান্য) বাগগুলি খুঁজে বের করার জন্য এবং এটি উত্পাদন-প্রস্তুত করার জন্য অনেকগুলি টুইটের প্রয়োজন হবে তবে এর মধ্যে খুব বেশি প্রচেষ্টা ছাড়াই কিছু সুন্দর চার্ট তৈরি করা যথেষ্ট ভাল good

2020-03-08 এ ডিপেক্স প্যাকেজ দ্বারা নির্মিত (v0.3.0)


4

আপনি geom_gene_arrowথেকে ব্যবহার করতে পারেlibrary(gggenes)

data.frame(y=c(10, 20, 30), n=c(300, 100, 200), transparency=c(10, 2, 4)) %>% 
  ggplot() + 
  geom_gene_arrow(aes(xmin = 0, xmax = n, y = y, alpha = transparency), 
                  arrowhead_height = unit(6, "mm"), fill='red') +
  scale_y_continuous(limits = c(5, 35))

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


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