2017-12-19 51 views
9

वहाँ एक रास्ता geom_curve पर बंद कर दिया तीर प्राप्त करने के लिए है? एक ही कोड geom_segment के साथ काम करता है। शायद यह एक बग है?भरण तीर

library(tidyverse) 

set.seed(123) 

data <- data_frame(x = rnorm(10), y = rnorm(10)) 

# NO ARROWHEAD FILL 

ggplot(data, aes(x, y)) + 
    geom_point() + 
    geom_curve(aes(x = 0, y = 0, xend = 1, yend = 1), 
      color = "black", 
      arrow = arrow(type = "closed")) 

# ARROWHEAD FILL WORKS 

ggplot(data, aes(x, y)) + 
    geom_point() + 
    geom_segment(aes(x = 0, y = 0, xend = 1, yend = 1), 
      color = "black", 
      arrow = arrow(type = "closed")) 
+0

जब/आप एक मुद्दा दाखिल करते हैं, तो आप इस पीआर मैं सिर्फ पाने के लिए किया जाता संदर्भित कर सकते हैं 'वापस fill' में यह उचित जगह है। https://github.com/tidyverse/ggplot2/pull/2375 – hrbrmstr

उत्तर

7

मैं इसे एक बग कहूंगा और आपको एक समस्या दर्ज करनी चाहिए। तब तक:

geom_curve2 <- function(mapping = NULL, data = NULL, 
         stat = "identity", position = "identity", 
         ..., 
         curvature = 0.5, 
         angle = 90, 
         ncp = 5, 
         arrow = NULL, 
         lineend = "butt", 
         na.rm = FALSE, 
         show.legend = NA, 
         inherit.aes = TRUE) { 
    layer(
    data = data, 
    mapping = mapping, 
    stat = stat, 
    geom = GeomCurve2, 
    position = position, 
    show.legend = show.legend, 
    inherit.aes = inherit.aes, 
    params = list(
     arrow = arrow, 
     curvature = curvature, 
     angle = angle, 
     ncp = ncp, 
     lineend = lineend, 
     na.rm = na.rm, 
     ... 
    ) 
) 
} 

GeomCurve2 <- ggproto("GeomCurve2", GeomSegment, 
    draw_panel = function(data, panel_params, coord, curvature = 0.5, angle = 90, 
         ncp = 5, arrow = NULL, lineend = "butt", na.rm = FALSE) { 
    if (!coord$is_linear()) { 
     warning("geom_curve is not implemented for non-linear coordinates", 
     call. = FALSE) 
    } 
    trans <- coord$transform(data, panel_params) 

    curveGrob(
     trans$x, trans$y, trans$xend, trans$yend, 
     default.units = "native", 
     curvature = curvature, angle = angle, ncp = ncp, 
     square = FALSE, squareShape = 1, inflect = FALSE, open = TRUE, 
     gp = gpar(
     col = alpha(trans$colour, trans$alpha), 
     fill = alpha(trans$colour, trans$alpha), 
     lwd = trans$size * .pt, 
     lty = trans$linetype, 
     lineend = lineend), 
     arrow = arrow 
    ) 
    } 
) 

कौन सा की ओर जाता है:

ggplot(data, aes(x, y)) + 
    geom_point() + 
    geom_curve2(aes(x = 0, y = 0, xend = 1, yend = 1), 
      color = "black", 
      arrow = arrow(type = "closed")) 

और

enter image description here

+1

डांग, मैं बस उसी समाधान को पेस्ट करने वाला था। तुमने मुझे एक मिनट से हराया। यहां तक ​​कि इसे मेरे कोड में 'geom_curve2' और' GeomCurve2' भी कहा जाता है। –

+1

:-) और, मुझे एक पीआर भी मिला है https://github.com/tidyverse/ggplot2/pull/2375 – hrbrmstr

+0

मेरे उत्तर के लिए प्रतीक्षा करें मैं अभी टाइप कर रहा हूं। –

5

जवाब @hrbrmstr दिया करने के लिए कुछ उपयोगी जोड़ने के लिए, मुझे लगता है कि दोनों geom_segment() और geom_curve() अनावश्यक रूप से कर रहे हैं इसमें सीमित है कि वे तीर रूपरेखा से अलग तीर भरने वाले रंग को निर्दिष्ट नहीं करते हैं। यहां मैं geom_curve2() प्रदान करता हूं जो आपको ऐसा करने की अनुमति देता है। बदली गई रेखाएं (ggplot2 कोड से संबंधित) को हाइलाइट किया गया है।

# copied from ggplot2 `geom_curve` 
geom_curve2 <- function(mapping = NULL, data = NULL, 
         stat = "identity", position = "identity", 
         ..., 
         curvature = 0.5, 
         angle = 90, 
         ncp = 5, 
         arrow = NULL, 
         lineend = "butt", 
         na.rm = FALSE, 
         show.legend = NA, 
         inherit.aes = TRUE) { 
    layer(
    data = data, 
    mapping = mapping, 
    stat = stat, 
    geom = GeomCurve2, # call `GeomCurve2` instead of `GeomCurve` 
    position = position, 
    show.legend = show.legend, 
    inherit.aes = inherit.aes, 
    params = list(
     arrow = arrow, 
     curvature = curvature, 
     angle = angle, 
     ncp = ncp, 
     lineend = lineend, 
     na.rm = na.rm, 
     ... 
    ) 
) 
} 

# copied from ggplot2 `GeomCurve` 
GeomCurve2 <- ggproto("GeomCurve2", GeomSegment, 
    # the following `default_aes =` statement is missing in ggplot2 `GeomCurve` 
    default_aes = aes(colour = "black", fill = "black", size = 0.5, linetype = 1, alpha = NA), 
    draw_panel = function(data, panel_params, coord, curvature = 0.5, angle = 90, 
         ncp = 5, arrow = NULL, lineend = "butt", na.rm = FALSE) { 
    if (!coord$is_linear()) { 
     warning("geom_curve is not implemented for non-linear coordinates", 
       call. = FALSE) 
    } 
    trans <- coord$transform(data, panel_params) 

    curveGrob(
     trans$x, trans$y, trans$xend, trans$yend, 
     default.units = "native", 
     curvature = curvature, angle = angle, ncp = ncp, 
     square = FALSE, squareShape = 1, inflect = FALSE, open = TRUE, 
     gp = gpar(
     col = alpha(trans$colour, trans$alpha), 
     # the following `fill = ` statement is missing in ggplot2 `GeomCurve` 
     fill = alpha(trans$fill, trans$alpha), 
     lwd = trans$size * .pt, 
     lty = trans$linetype, 
     lineend = lineend), 
     arrow = arrow 
    ) 
    } 
) 

अब हम तीर रूपरेखा से अलग से भरने निर्दिष्ट कर सकते हैं:

ggplot(data, aes(x, y)) + 
    geom_point() + 
    geom_curve2(aes(x = 0, y = 0, xend = 1, yend = 1), 
       color = "black", fill = "red", 
       arrow = arrow(type = "closed")) 

enter image description here

कैसे geom_segment() के बराबर परिवर्तन करने के लिए पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है।

+1

ऐई को परेशान नहीं किया। मैंने थोड़ी सी अजीब पाया और न ही 'भर' भी था। मैं पर यह – hrbrmstr

+1

हे भगवान यह और आप सीसी के लिए मेरी पीआर आधुनिक करेंगे मुझे आशा है कि मैक्रो ऑटो फिर से जनरल ggplot2-स्वचालन अंत पर सौंदर्य अनुभाग डॉक्स :-) – hrbrmstr

+1

लालकृष्ण मैं इसे 'geom_segment' के रूप में वापस भेजा अच्छी तरह से और पीआर पर आप cc'd। – hrbrmstr