グラフで考える会社法の機関設計

会社法の機関を基本書でよくみる一覧表だけで理解できるとはとうてい思えない。
と思ってなにかいい方法がないのかと思っていたら、図で覚える機関設計というのを見つけた。
【渾身】図で覚える 株式会社の機関設計 (経営法務)【中小企業診断士】 – 中小企業診断士試験 一発合格道場
グラフというのはいわゆるネットワーク図のことである。

委員会のところは監査等委員会設置会社か、指名委員会等設置会社かの区別はあるが、経営層と内部監査機関のゴチャゴチャ具合がわかりやすくなったし、なにより本を読んでいて「…公開会社(ただし指名委員会等
設置会社を除く)…」みたいな記述があったときに、()内が長すぎて何をいまいちわかりにくかったのが、このグラフでどのノードを通ったグラフを構成している会社か把握できるようになったので、なんとなく読みやすくなった、気がする。
何より機関設計系の短答問題が確実に解けるようになったのでよかった。

library(igraph)
library(plotrix)
myellipse <- function(coords, v=NULL, params) {
    vertex.color <- params("vertex", "color")
    if (length(vertex.color) != 1 && !is.null(v)) {
        vertex.color <- vertex.color[v]
    }
    vertex.frame.color <- params("vertex", "frame.color")
    if (length(vertex.frame.color) != 1 && !is.null(v)) {
        vertex.frame.color <- vertex.frame.color[v]
    }
    vertex.size <- 1/1 * params("vertex", "size")
    if (length(vertex.size) != 1 && !is.null(v)) {
        vertex.size <- vertex.size[v]
    }
    vertex.size2 <- 1/1 * params("vertex", "size2")
    if (length(vertex.size2) != 1 && !is.null(v)) {
        vertex.size2 <- vertex.size2[v]
    }
    draw.ellipse(coords[,1], coords[,2], vertex.size, vertex.size2, col = vertex.color, border=vertex.frame.color)
}
add_shape("ellipse", clip=igraph.shape.noclip, plot=myellipse)


l <- rbind(
     c("株主総会", "取締役"),
     c("株主総会", "取締役会"),
     c("取締役", "監査役"),
     c("取締役会", "監査役"),
     c("取締役会", "監査役会"),
     c("取締役会", "委員会"),
     c("監査役", "会計監査人"),
     c("監査役会", "会計監査人"),
     c("委員会", "会計監査人"),
     c("取締役会", "会計参与")
     )
kikan <- c("株主", "経営層", "内部監査", "外部監査")
kikan.col <- adjustcolor(c("violet", "green", "orange", "cyan"), 0.3)
vertex.col <- c("止まれない"="cornsilk", "止まれる"="seagreen1")
g <- graph_from_edgelist(l)
lsugiyama <- t(matrix(c(1,1,0,2,1,2,0,3,1,3,2,3,1,4,2,2), nr=2))
n <- norm_coords(t(matrix(c(1,1,0,2,1,2,0,3,1,3,2,3,1,4,2,2), nr=2)))
rownames(lsugiyama) <- rownames(n) <- V(g)$name
V(g)$label.font <- 2
V(g)$label.color <- "black"
V(g)$shape <- "circle"
V(g)$shape[match(c("取締役", "監査役", "監査役会", "会計参与", "会計監査人"), V(g)$name)] <- "rectangle"
V(g)$shape[match(c("株主総会", "取締役会", "委員会"), V(g)$name)] <- "ellipse"
V(g)$color <- ifelse(V(g)$shape == "rectangle", vertex.col["止まれる"], vertex.col["止まれない"])
V(g)$size <- 30
V(g)$vertex.size2 <- 20
V(g)$frame.color <- "black"
V(g)$frame.color[match("取締役会", V(g)$name)] <- "red"

E(g)$color <- "black"
E(g)$arrow.size <- 2
E(g)$width <- 2
E(g)$lty <- ifelse(apply(as_edgelist(g), 1, setequal, c("取締役会", "会計参与")), 3, 1)
E(g)$color <- ifelse(apply(as_edgelist(g), 1, setequal, c("監査役", "会計監査人")), "red", "black")

par(mar=c(0, 0, 0, 0))
plot(g, layout=lsugiyama, vertex.shape="none", vertex.label=NA, edge.color=NA)
pa <- par()$usr
y <- c(sort(unique(norm_coords(lsugiyama)[,2])), 100)
for(i in seq(kikan)){
  y0 <- y[c(i, i, i+1, i+1)]-diff(y)[1]/2
  polygon(pa[c(1,2,2,1)], y0, col=kikan.col[i], border=NA)
  if(i != 1){
    legend(pa[2], y0[1], legend=kikan[i], xjust=1, yjust=0, bty="n", text.font=2)
  } else {
    legend(pa[2], y[1], legend=kikan[i], xjust=1, yjust=0.5, bty="n", text.font=2)
  }
}
legend("topright", legend=names(vertex.col), pch=c(21, 22), pt.bg=vertex.col, bty="n", cex=2.0)
plot(g, layout=lsugiyama, vertex.size=40, vertex.size2=15, add=TRUE)
text(n["会計監査人", 1], n["会計監査人", 2], "大会社", adj=c(NA, -2))
xy <- colMeans(n[c("会計監査人", "監査役"),])
text(xy[1]-0.2, xy[2], "大会社\nかつ\n公開会社\nは不可", adj=c(NA, 0))
text(n["取締役会", 1], n["取締役会", 2], "公開会社", adj=c(2, NA))
text(n["会計参与", 1], n["会計参与", 2], "任意に設置可能", adj=c(NA, -2.0))
xy <- colMeans(n[c("取締役会", "会計参与"),])
text(xy[1]-0.10, xy[2], "非大会社\nかつ\n非公開会社\nは可能", adj=c(0.5, 1.2))