【问题标题】:Error 'undefined columns selected' - Chord diagram (circlize package) in R错误“选择了未定义的列”-R 中的和弦图(circlize 包)
【发布时间】:2017-04-10 15:28:15
【问题描述】:

在使用 circlize 包中的 chordDiagram() 函数时返回错误消息时,我需要一些帮助。

我正在处理渔业上岸问题。渔船在一个港口(母港PORT_DE)开始航行,然后在另一个港口(上岸港口PORT_LA)上岸(在这种情况下为扇贝)。我正在尝试使用circlize 包绘制和弦图,以可视化端口之间的着陆流。我有 161 个唯一端口,端口名称存储为 character 字符串。

在调用chordDiagram() 函数绘制和弦图之前,我将相关列存储在一个虚拟对象(m)中。

# Store relevant column
m <- data.frame(PORT_DE = VMS_by_trips$PORT_DE_Label, 
            PORT_LA = VMS_by_trips$PORT_LA_Label, 
            SCALLOP_W = VMS_by_trips$Trip_SCALLOP_W)

head(m)
# PORT_DE  PORT_LA SCALLOP_W
# 1  Arbroath Arbroath  2.147143
# 2  Eyemouth Aberdeen  8.791970
# 3    Buckie Aberdeen  2.025833
# 4  Montrose Aberdeen  8.268540
# 5  Aberdeen Aberdeen  1.358286
# 6 Peterhead Aberdeen  0.797500

然后我使用dcast() 创建一个邻接矩阵并重命名行。

require(reshape2)
m <- as.matrix(dcast(m, PORT_DE ~ PORT_LA, value.var = "SCALLOP_W", fun.aggregate = sum))
dim(m) #adjecency matrix represents port pairs
#[1] 153 138

row.names(m) <- m[,1]
m <- m[,2:dim(m)[2]]
class(m) <- "numeric"

最后,我调用绘图函数 chordDiagram()

library(circlize) 
chordDiagram(m) 

很遗憾,这会导致错误消息。

Error in `[.data.frame`(df, c(1, 2, 5)) : undefined columns selected

如果我用数字替换行名和列名,函数就会运行,并返回正确的绘图。

row.names(m) <- 1:153
colnames(m) <- 1:137

任何想法如何使用实际端口名称运行函数?

我已经尝试删除特殊字符,将" " 空格替换为"_" 下划线,保留较少数量的字符,只保留几个端口对。不幸的是,同样的错误不断出现。任何帮助表示赞赏。

请注意,自从发布这个问题以来,我已经设法创建了 需要可视化。这是另一个相关问题的链接, 其中还包括调整和弦各种设置的代码 图。

Adjust highlight.sector() width and placement - Chord diagram (circlize package) in R

【问题讨论】:

  • chordDiagram 将适用于数据框和矩阵。请参阅?chordDiagramFromDataFrame
  • @gjabel 感谢您的及时回复。如果我设法解决自己,我会在这里查看并回复。
  • 我用你附加的代码试过你的六行数据(head(m)),没有出现错误。你能附上完整的数据集吗?另一方面,chordDiagram() 可以直接应用于数据框,无需将其转换为矩阵。
  • @ZuguangGu 感谢您通过电子邮件回复我的问题。为了stackoverflow社区的利益,我现在已经在下面发布了我的问题的答案。

标签: r chord circlize


【解决方案1】:

感谢@ZuguangGu,错误消息的原因是我的列名中的NAs。如果你先删除它们,那么和弦图就很好了。遵循相同的符号,请参见下文。

#create adjacency matrix
m <- data.frame(PORT_DE = VMS_by_trips$PORT_DE_Label, 
                PORT_LA = VMS_by_trips$PORT_LA_Label, 
                SCALLOP_W = VMS_by_trips$Trip_SCALLOP_W)


#Check for NA values in your dataset
which(is.na(m[, 1]))
which(is.na(m[, 2]))

#Remove the rows which have NA values, there will not be errors any more.
df = m
df = df[!(is.na(df[[1]]) | is.na(df[[2]])), ]

require(reshape2)
m <- dcast(df, PORT_DE ~ PORT_LA, value.var = "SCALLOP_W", fun.aggregate = sum)
row.names(m) <- m[,1]
m <- as.matrix(m[, -1])

# remove self-links
m2 = m
cn = intersect(rownames(m2), colnames(m2)) 
for(i in seq_along(cn)) {
  m2[cn[i], cn[i]] = 0
}

# Export 3 versions of the chord diagram in a PDF

library(circlize) 

pdf("test.pdf")

# Use all data
chordDiagram(m)
title("using all data")

#remove self-links
chordDiagram(m2)
title("remove self-links")

#here reduce = 0.01 means to remove ports which have capacity less than 0.01 of capacity of all ports.
chordDiagram(m2, reduce = 0.01)
title("remove self-links and small sectors")

dev.off()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多