如何使用ggplot的周期表显示计数?

时间:2015-03-19 21:06:08

标签: r ggplot2 chemistry

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

如何使用ggplot执行此操作?我可以使用地图吗?

1 个答案:

答案 0 :(得分:7)

通过一些搜索,我在this example code project中找到了有关元素周期表的信息。他们有一个包含元素信息的Access数据库。我已将其导出到this gist。您可以使用带有

httr库导入数据
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))

enter image description here

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

您可能会寻找更强大的分解函数。看起来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))