web-dev-qa-db-ja.com

ggplot2で素敵な矢印を描く方法

2つのポイント間に矢印を入れたいggplotチャートを作成しています。メインタスクはgeom_line(arrow = arrow())で簡単に行えます。ただし、「美しい」太い矢印がいくつか必要です。 size=を使用して矢印のサイズを変更しても、矢印の頭が完全に台無しになるため、役に立ちません。私の問題を説明します:

サンプルデータとプロットを作成します。

 NAME <- c("A", "A", "B", "B", "C", "C")
 YEAR <- c(2016, 2011, 2016, 2011, 2016, 2011)
 YEAR <- as.factor(YEAR)
 VALUE <- c(1, 4, 1, 5, 2, 8)
 DATA <- data.frame(NAME, YEAR, VALUE)

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
  geom_point(size=5, aes(colour=YEAR)) +
  geom_line(arrow = arrow(length=unit(0.30,"cm"), ends="first", type = "closed"))

結果のプロットは次のようになります。

plot1

今、私は矢印を「太く」しようとしました...

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
  geom_point(size=5, aes(colour=YEAR)) +
  geom_line(arrow = arrow(length=unit(0.30,"cm"), ends="first", type = "closed"), size = 3)

これが、次の結果です。

plot2

私の質問:「美しい」太い矢印をプロットする方法はありますか?

24
Sebastian Kuhn

通常、geom_segmentを使用して矢印を作成します。ただし、そのためには、データを「long」形式から「wide」形式に変更する必要があります(通常、reshape2またはdata.tableパッケージのdcastを使用します)。しかし、今回はbasereshape関数を使用してみました。

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
  geom_point(size=5, aes(colour=YEAR)) +
  geom_segment(data = reshape(DATA, v.names="VALUE", idvar = "NAME", timevar = "YEAR", direction = "wide"),
               aes(x=VALUE.2011, xend=VALUE.2016, y=NAME, yend=NAME), size = 2,
               arrow = arrow(length = unit(0.5, "cm")))

arrow.segment

[〜#〜] edit [〜#〜]:「閉じた」タイプの矢印にも同じ問題が関係していることがわかりました。今のところ、プロットをベクトルグラフ(pdfまたはsvg、ggsaveまたは[プロット]タブの[エクスポート]メニューを使用)として保存してみてください。結果は「乱雑」ではありません。

svg

8
zyurnaidi

ggplot2の最新バージョン(およびこの回答を書いている時点でdevtools::install_github("tidyverse/ggplot2")の最新版-すぐにメインラインになると確信しています)には、geom_segmentlinejoin引数があります。 linejoin='mitre'を使用すると、鮮明なエッジが得られます。 詳細は以下 を参照してください。

6
Carl

これには非常に単純ですが、いくぶん「ハッキングな」解決策があります。

アイデアは、最初に線を描くことです(望ましい太さで、矢じりはありません)が、少し短くします(場合によっては計算できます)。次に、矢印でサイズを変更せずに2本目の線を描画します。結果のオーバーレイは、希望どおりに見えます。

0
LiKao