我有一个大的转换矩阵,我想在r中绘制一个图形。我已选择markovchain包来执行此操作,这允许我将此矩阵转换为markovchain对象,然后将其绘制如下:
library(markovchain)
tMat = matrix(c(0,.2,.7,.1,.3,.4,.3,.1,.4,.5),3,3)
mc = new("markovchain",transitionMatrix = tMat)
plot(mc)
当然,这只是一个例子,正如我之前提到的那样,真正的转换矩阵更加毛茸茸。
我的问题是:如何只绘制值大于某个最小阈值的边?如果我试图将所有低于某个阈值的值“归零”,则markovchain会抱怨行不总和为1(因为它不再是一个单一的社会矩阵)。但对于一个非常复杂的图形,连接到顶点的边总和为1并不重要,更重要的是图形仍然可读。有没有办法做到这一点?
我知道绘图函数是建立在igraph.plot之上的,所以我希望那里有一些可能有帮助的选项吗?
任何建议都会非常感谢!
-Paul
woops:我回答了我自己的问题。只是想留下这个,以防其他人遇到同样的问题:你可以简单地创建markovchain对象,然后进入其transitionMatrix属性并直接编辑值:
mc@transitionMatrix[mc@transitionMatrix<.2] = 0
现在一个上帝后续问题实际上解决了原始问题,并且将是一个更好的解决方案:如何仅抑制图形输出中的数字而不是完全删除线条?它会导致先前连接的节点/顶点成为岛屿的丑陋情况。我认为这将涉及到存储这些值的igraph.plot对象的部分,即使在重新选择之后我也不知道该怎么做。
答案 0 :(得分:3)
如何仅抑制图形输出中的数字而不是 完全删除这些行?
将markovchain对象强制转换为igraph对象;现在你获得了所需的所有灵活性:
library(markovchain)
statesNames=c("a","b","c")
mc<-new("markovchain", states=statesNames, transitionMatrix=
matrix(c(0.2,0.5,0.3,
0,1,0,
0.1,0.8,0.1),nrow=3, byrow=TRUE, dimnames=list(statesNames,statesNames)
))
g <- as(mc, "igraph")
min <- 0.5
plot(g, edge.label=ifelse(E(g)$prob>=min, E(g)$prob, NA))