0

我有一个元素成分列表,我想显示元素包含在映射到元素周期表上的成分中的次数(例如 ,CH4将计数增加一)。HC

我该怎么做ggplot?有我可以使用的地图吗?

4

1 回答 1

7

经过一番搜索,我在这个示例代码项目中找到了有关元素周期表的信息。他们有一个包含元素信息的 Access 数据库。我已经将它导出到这个 gisthttr您可以使用库导入数据

library(httr)
dd <- read.table(text=content(GET("https://gist.githubusercontent.com/MrFlick/c1183c911bc5398105d4/raw/715868fba2d0d17a61a8081de17c468bbc525ab1/elements.txt")), sep=",", header=TRUE)

(您可能应该创建自己的本地版本,以便将来更容易加载。)

然后您的另一个挑战是将“CH4”之类的内容分解为原始元素计数。我创建了这个辅助函数,我认为它可以满足您的需要。

decompose <- function(x) {
    m <- gregexpr("([A-Z][a-z]?)(\\d*)", x, perl=T)
    dx <- Map(function(x, y) {
        ElementSymbol <- gsub("\\d","", x)
        cnt <- as.numeric(gsub("\\D","", x))
        cnt[is.na(cnt)]<-1
        cbind(Sym=y, as.data.frame(xtabs(cnt~ElementSymbol)))
    }, regmatches(x,m), x)
    do.call(rbind, dx)
}

这里我测试一下功能

test_input <- c("H2O","CH4")
decompose(test_input)

#   Sym ElementSymbol Freq
# 1 H2O             H    2
# 2 H2O             O    1
# 3 CH4             C    1
# 4 CH4             H    4

现在我们可以结合数据和参考信息来绘制一个图

library(ggplot2)
ggplot(merge(decompose("CH4"), dd), aes(Column, -Row)) + 
    geom_tile(data=dd, aes(fill=GroupName), color="black") + 
    geom_text(aes(label=Freq))

在此处输入图像描述

显然有改进的机会,但这应该给你一个好的开始。

您可能会寻找更强大的分解函数。CHNOSZ包裹里好像有一个

library(CHNOSZ)
data(thermo)
decompose <- function(x) {
    do.call(`rbind`, lapply(x, function (x) {
       z <- makeup(x)
       cbind(data.frame(ElementSymbol = names(z),Freq=z), Sym=x)
    }))
}
ggplot(merge(decompose("CaAl2Si2O7(OH)2*H2O"), dd), aes(Column, -Row)) + 
    geom_tile(data=dd, aes(fill=GroupName), color="black") + 
    geom_text(aes(label=Freq))
于 2015-03-19T22:04:42.373 回答