Hatena::ブログ(Diary)

もうカツ丼でいいよな このページをアンテナに追加 RSSフィード Twitter

2009 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 12 |
2012 | 02 | 03 | 04 | 05 | 06 | 10 | 11 | 12 |
2013 | 01 | 02 | 04 | 06 |
2014 | 06 |

2011-08-23

[][] 農薬の散布間隔図をRのigraphパッケージでプロットしてみた 23:30  農薬の散布間隔図をRのigraphパッケージでプロットしてみたを含むブックマーク  農薬の散布間隔図をRのigraphパッケージでプロットしてみたのブックマークコメント

異なる2種の農薬を作物に散布するとき、間を十分にあけずに散布すると薬害がでやすくなるような農薬の組み合わせがある。

それで、「この農薬を散布してからこの農薬を散布するまでは◯◯日開けろ」というのを図にまとめたものが新版 ピシャッと効かせる農薬選び便利帳という本に書いてある(元データは日本曹達農薬要覧らしい。あと実際の農薬の使用にあたっては必ずラベルを確認して記載の使用方法に従ってください。)。

要するにこれは重み付きグラフ(ノードとかエッジとかがある方)なので、igraphパッケージ使ってプロットしてみた。

ちなみにigraphパッケージの使い方の簡単な部分だけ昔まとめたのでよろしければどうぞ。

で、スクリプトはこんな感じ。

library(igraph)

lab <- c("ボルドー液",                                #0
         "マンネブ剤\nジネブ剤\nポリカーバメート剤",  #1
         "DCPA剤",                                    #2
         "有機リン剤\nカーバメート剤",                #3
         "石灰硫黄合剤",                              #4
         "有機・無機\n銅水和剤",                      #5
         "マシン油\n乳剤",                            #6
         "ビーナイン")                                #7
edge <- c(0,1, 0,3, 0,4, 0,7,
          1,0, 1,5,
          2,3,
          3,2,
          4,0, 4,1,
          5,1, 5,7,
          6,4, 6,0,
          7,5, 7,0)
weight <- c(7, 30, 30, 30,
            7, 7,
            10,
            10,
            15, 5,
            7, 20,
            30, 30,
            5, 3)
g <- graph(edge, directed=TRUE)

E(g)$label <- weight
E(g)$curved <- 0
E(g)$label.cex <- 0.9
E(g)$label.dist <- 1.5
E(g)$arrow.size <- 0.5
V(g)$label <- lab
V(g)$shape <- "rectangle"
V(g)$label.cex <- c(1, 0.6, 1, 0.8, 0.8, 0.8, 1, 1)*0.9
V(g)$size <- 45
V(g)$size2 <- 20

plot(g, layout = layout.random)
plot(g, layout = layout.circle)
plot(g, layout = layout.fruchterman.reingold)
plot(g, layout = layout.kamada.kawai)
plot(g, layout = layout.spring)
plot(g, layout = layout.reingold.tilford)
plot(g, layout = layout.fruchterman.reingold.grid)
plot(g, layout = layout.lgl)
plot(g, layout = layout.graphopt)
plot(g, layout = layout.mds)
plot(g, layout = layout.svd)

こうすると何が嬉しいかっていうと、レイアウトを適当に変更した結果を簡単に確認できるという点。

スクリプトの最後にずらずらとplotが並んでいるが、これはそれぞれデフォルトで用意されているレイアウト用のアルゴリズム適用している。実際に実行してみるとそれぞれ特徴的なノード配置になることが理解できるだろう。

例えばlayout.circleではただ円形にノードが並ぶ。

f:id:Rion778:20110823232917p:image

元ネタの本に載ってるのはこれを手書きにしたようなやつで、見たら分かるようにエッジが交叉する部分が多くてちょっとごちゃっとした印象を受ける。

そこでlayout.lglというやつを使うと、例えば(毎回異なる)こんな感じのグラフが描画される。

f:id:Rion778:20110823232916p:image

一部数字が隠れたりしているが、「ボルドーは何か矢印沢山出たり入ったりしてるし注意しないといけないな」というような事がパッと見理解しやすいのではないかと思う。

まあもちろんこんなもん作ってる暇あったらさっさと暗記したほうがいいんじゃないのという感は否めません。

トラックバック - http://d.hatena.ne.jp/Rion778/20110823/1314109827
Connection: close