首页 > 解决方案 > 错误:提供给连续比例的离散值 - 从 igraph 绘制邻接矩阵时出错

问题描述

我想将图形的邻接矩阵绘制为棋盘格。该代码适用于使用内置“make_star”等函数创建的图形,但在使用从 csv 文件中的邻接矩阵创建的图形时会失败。

此测试中使用的 csv 文件可在此处找到

require(igraph)
require(ggplot2)
require(reshape2)

require("igraph")


loadGraph <- function(dataPath)
{

  loadedDF <- read.csv(dataPath,
                       header=FALSE,
                       sep=',', #separate by comma
                       quote="'", # quote by '
                       stringsAsFactors = FALSE,
                       check.names = FALSE)

  #selects numeric values, drops the rest
  loadedDF <- loadedDF[sapply(loadedDF, is.numeric)]

  rownames(loadedDF) <- colnames(loadedDF)
  loadedMat <- as.matrix(loadedDF)

  #we use the rownames to index deletions
  g <- graph_from_adjacency_matrix(loadedMat) %>%
    set_vertex_attr("label", value = 1:nrow(loadedDF))


  return(g)
}

plotAdjMatrix <- function(graphToPlot){

  gAdjMatrix <- as.matrix(as_adj(graphToPlot))

  logMatrix <- (gAdjMatrix == 1)

  matData <- melt(logMatrix)

  g <- ggplot(data = matData,
              aes(Var2, Var1)) + 
    geom_tile(aes(fill = value, 
                  color = value)) + 
    coord_equal() + 
    scale_fill_manual(values = c("TRUE" = "black", "FALSE" = "white")) + 
    scale_color_manual(values = c("TRUE" = "white", "FALSE" = "black")) + 
    theme_bw() +
    theme(axis.title = element_blank(),
          axis.text = element_blank(),
          axis.ticks = element_blank(),
          panel.grid = element_blank()) +
    guides(fill = FALSE, color = FALSE) +
    scale_y_reverse()

  print(g)
}

## Test #1 
g1 <- make_star(5)

# this works
plotAdjMatrix(g1)

## Test #2
g2 <- loadGraph("./data/starGraphAdjMatrix.csv")

# this fails
plotAdjMatrix(g2)

这就是 g1 的样子

g1
IGRAPH b93c150 D--- 5 4 -- In-star
+ attr: name (g/c), mode (g/c), center (g/n)
+ edges from b93c150:
[1] 2->1 3->1 4->1 5->1

这是g2:

> g2
IGRAPH e338cdb DN-- 5 8 -- 
+ attr: name (v/c), label (v/n)
+ edges from e338cdb (vertex names):
[1] V1->V2 V1->V3 V1->V4 V1->V5 V2->V1 V3->V1 V4->V1 V5->V1

看着这个,我想到将“g2”中的顶点重命名为“1,2,3,...”,并尝试删除该行:

 set_vertex_attr("label", value = 1:nrow(loadedDF)

没有效果。

标签: rggplot2plotigraph

解决方案


有趣的是,问题在scale_y_reverse. 当您从 csv 文件加载数据时,列名是 V1、...、V5,y轴中的标签也是如此。然后,显然,scale_y_reverse失败了,因为它试图反转非数字值,同时将它们视为数字。

解决此问题的一种方法是更换

gAdjMatrix <- as.matrix(as_adj(graphToPlot))

gAdjMatrix <- unname(as.matrix(as_adj(graphToPlot)))

推荐阅读