我有一个元素成分列表,我想显示元素包含在映射到元素周期表上的成分中的次数(例如 ,CH4
将计数增加一)。H
C
我该怎么做ggplot
?有我可以使用的地图吗?
经过一番搜索,我在这个示例代码项目中找到了有关元素周期表的信息。他们有一个包含元素信息的 Access 数据库。我已经将它导出到这个 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))
显然有改进的机会,但这应该给你一个好的开始。
您可能会寻找更强大的分解函数。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))