Zamierzam zbudować wykres słupkowy ze strzałkami na końcu taktów. Poszedłem geom_segment
z arrow
określonym. Chcę zmapować jedną kolumnę na przezroczystość, ale estetyka alfa wydaje się nie działać dobrze z obiektem strzałki. Oto fragment kodu:
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))
Łatwo można zauważyć, że arrow
obiekt nie wygląda dobrze przy niższych wartościach alpha
, pokazując szkielet zamiast zwykłego, przezroczystego kształtu. Czy istnieje sposób, aby temu zapobiec?
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))
Odpowiedzi:
Możemy stworzyć nowy geom, z
geom_arrowbar
którego będziemy mogli korzystać jak każdy inny geom, więc w twoim przypadku dałoby to pożądaną fabułę, po prostu wykonując:I zawiera 3 parametry
column_width
,head_width
ahead_length
które pozwalają zmienić kształt strzałki, jeśli nie podoba ci się domyślne. W razie potrzeby możemy również określić kolor wypełnienia i inne elementy estetyczne:Jedyną przeszkodą jest to, że najpierw musimy to napisać!
Postępując zgodnie z przykładami w rozszerzającej się winiecie ggplot2 , możemy zdefiniować naszą
geom_arrowbar
w ten sam sposób, w jaki zdefiniowane są inne geomy, z wyjątkiem tego, że chcemy móc przekazać nasze 3 parametry kontrolujące kształt strzałki. Są one dodawane doparams
listy wynikowegolayer
obiektu, który zostanie użyty do utworzenia naszej warstwy strzał:Teraz „wszystko”, co pozostaje, to zdefiniowanie, czym
GeomArrowBar
jest a . Jest to faktycznieggproto
definicja klasy. Najważniejszą jego częścią jestdraw_panel
funkcja członka, która pobiera każdą linię naszej ramki danych i przekształca ją w kształty strzałek. Po kilku podstawowych obliczeniach matematycznych dotyczących współrzędnych xiy oraz różnych parametrów kształtu, jaki powinien być kształt strzałki, tworzy jedengrid::polygonGrob
dla każdej linii naszych danych i przechowuje go wgTree
. To tworzy komponent graficzny warstwy.Ta implementacja jest daleka od ideału. Brakuje niektórych ważnych funkcji, takich jak rozsądne domyślne limity osi i zdolność do
coord_flip
, i przyniesie nieestetyczne wyniki, jeśli strzały są dłuższe niż cała kolumna (choć i tak nie chcesz używać takiego wykresu w tej sytuacji) . Jednak rozsądnie będzie mieć strzałkę skierowaną w lewo, jeśli masz wartość ujemną. Lepsza implementacja może również dodać opcję pustych strzałek.Krótko mówiąc, wymagałoby to wielu poprawek, aby wyeliminować te (i inne) błędy i sprawić, że będzie gotowy do produkcji, ale w międzyczasie jest wystarczająco dobry, aby wygenerować fajne wykresy.
Utworzono 2020-03-08 przez pakiet reprezentx (v0.3.0)
źródło
Możesz użyć
geom_gene_arrow
zlibrary(gggenes)
źródło