R 邻接矩阵的顶点坐标;随机转移矩阵在作物轮作中的应用

R 邻接矩阵的顶点坐标;随机转移矩阵在作物轮作中的应用,r,plot,graphics,igraph,adjacency-matrix,R,Plot,Graphics,Igraph,Adjacency Matrix,上下文:我试图从描述从一种作物到另一种作物的变化的过渡矩阵绘制作物旋转。对于那些想知道的人来说,使用转移矩阵来表示作物轮作已经出版,但参考文献并不是关于绘制地块的;见: 卡斯特拉齐,M.S.,伍德,G.A.,伯吉斯,p.J.,莫里斯,J.,康拉德, K.F.,佩里,J.N.,2008年。对作物的系统描述 轮换。农业系统97,26-33。 所谓随机矩阵,我指的是一个平方矩阵,表示一步内从Ci到Cj的转移概率。每行的和等于一 这归结为使用随机转移矩阵作为邻接矩阵来构建加权有向图。这可以通过使用di

上下文:我试图从描述从一种作物到另一种作物的变化的过渡矩阵绘制作物旋转。对于那些想知道的人来说,使用转移矩阵来表示作物轮作已经出版,但参考文献并不是关于绘制地块的;见:

卡斯特拉齐,M.S.,伍德,G.A.,伯吉斯,p.J.,莫里斯,J.,康拉德, K.F.,佩里,J.N.,2008年。对作物的系统描述 轮换。农业系统97,26-33。

所谓随机矩阵,我指的是一个平方矩阵,表示一步内从Ci到Cj的转移概率。每行的和等于一

这归结为使用随机转移矩阵作为邻接矩阵来构建加权有向图。这可以通过使用
diagram::plotmat()
igraph::graph\u from\u data\u frame()
来完成,但我就是不知道如何对顶点排序并使边看起来“漂亮”

预期图:

我要使用的矩阵如下所示:

> transmat
   C1 C2  C3  C4 C5
C1  0  1 0.0 0.0  0
C2  0  0 0.5 0.5  0
C3  0  0 0.0 0.0  1
C4  0  0 0.0 0.0  1
C5  1  0 0.0 0.0  0

> dput(transmat)
structure(list(C1 = c(0, 0, 0, 0, 1), C2 = c(1, 0, 0, 0, 0), 
    C3 = c(0, 0.5, 0, 0, 0), C4 = c(0, 0.5, 0, 0, 0), C5 = c(0, 
    0, 1, 1, 0)), class = "data.frame", row.names = c("C1", "C2", 
"C3", "C4", "C5"))
尝试使用
diagram::plotmat()

## With diagram::plotmat ----------------------------------------------------

plot.new()
plotmat(t(transmat), 
        pos = c(1,1,2,1), # non-0 count in each line of transmat
        curve = 0.3, 
        absent = 0, # don't connect crops linked by 0
        arr.type = "triangle",
        arr.pos = 0.6,
        box.type = "rect",
        box.prop=0.3,
        box.lwd=2,
        shadow.size = 0,
        cex.txt=0.8,
        endhead = FALSE)
输出:

另一个例子是
igraph::graph\u from\u data\u frame()
layout=layout\u as\u tree()

## With diagram::plotmat ----------------------------------------------------

plot.new()
plotmat(t(transmat), 
        pos = c(1,1,2,1), # non-0 count in each line of transmat
        curve = 0.3, 
        absent = 0, # don't connect crops linked by 0
        arr.type = "triangle",
        arr.pos = 0.6,
        box.type = "rect",
        box.prop=0.3,
        box.lwd=2,
        shadow.size = 0,
        cex.txt=0.8,
        endhead = FALSE)
预期图:

关联矩阵:

> complex_ex
     C1   C2  C3  C4   C5
C1 0.00 1.00 0.0 0.0 0.00
C2 0.00 0.00 0.5 0.5 0.00
C3 0.25 0.25 0.0 0.0 0.50
C4 0.00 0.00 0.0 0.0 1.00
C5 0.75 0.00 0.0 0.0 0.25

> dput(complex_ex)
structure(list(C1 = c(0, 0, 0.25, 0, 0.75), C2 = c(1, 0, 0.25, 
0, 0), C3 = c(0, 0.5, 0, 0, 0), C4 = c(0, 0.5, 0, 0, 0), C5 = c(0, 
0, 0.5, 1, 0.25)), class = "data.frame", row.names = c("C1", 
"C2", "C3", "C4", "C5"))
我使用的代码是:

# Some data transformation to make it work with igraph::graph_from_data_frame()

df_transmat <- as.data.frame(complex_ex)
df_transmat$from <- rownames(df_transmat)
df_transmat <- reshape(df_transmat,
                    idvar = "from",
                    varying = colnames(df_transmat)[1:(ncol(df_transmat)-1)],
                    times = colnames(df_transmat)[1:(ncol(df_transmat)-1)],
                    timevar = "to",
                    v.names = "change",
                    direction = "long")
rownames(df_transmat) <- NULL
rotation <- subset(df_transmat, subset = df_transmat$change != 0)

# The plot 

g1 <- graph_from_data_frame(rotation, directed = TRUE)

plot(g1, 
     layout = layout_as_tree(g1, root = "C1"),
     edge.arrow.mode = 2,
     edge.arrow.size = 0.5,
     edge.curved = 0,
     edge.width = 0.5,
     vertex.label.cex = 1, 
     vertex.label.font = 2,
     vertex.shape = "rectangle", 
     vertex.color = "white",
     vertex.size = 50,
     vertex.size2 = 30,
     vertex.label.dist = 0,
     vertex.label.color = "black")
#进行一些数据转换,以使其与来自_data_frame()的igraph::graph_一起工作

df_transmat您能否澄清您能够获得的绘图输出有什么问题?是不是它没有将节点按左右方向排列?@JoshPurtell,是的,但不仅如此,行和链接不是我希望的方式;在我看来,这看起来很混乱。另外,这个例子非常简单,有时旋转要复杂得多(引用的文章中有一些例子),那么所有节点的顺序都正确就变得非常重要了
功能,但它需要非常复杂的代码,并且只适用于线性旋转,即它不能表示C2/C3/C4链路。您能定义stoch吗。你的问题是R码中的矩阵?我想我有一个方法要测试。。我知道我也可以简单地定义它,但它会帮助其他观众。另外,理想情况下,您可以为您提到的“更难”的示例之一添加stoch矩阵,因为它似乎是一个完整的答案,必须能够扩展到那些示例。我正在处理更复杂的示例。您能否澄清您能够获得的绘图输出有什么问题?是不是它没有将节点按左右方向排列?@JoshPurtell,是的,但不仅如此,行和链接不是我希望的方式;在我看来,这看起来很混乱。另外,这个例子非常简单,有时旋转要复杂得多(引用的文章中有一些例子),那么所有节点的顺序都正确就变得非常重要了功能,但它需要非常复杂的代码,并且只适用于线性旋转,即它不能表示C2/C3/C4链路。您能定义stoch吗。你的问题是R码中的矩阵?我想我有一个方法要测试。。我知道我也可以简单地定义它,但它会帮助其他观众。另外,理想情况下,您可以为您提到的“更难”的示例之一添加一个stoch矩阵,因为它似乎是一个完整的答案,必须能够扩展到这些示例,我正在处理更复杂的示例。