我有一个元素组成列表,我想显示一个元素包含在映射到元素周期表的组合中的次数(例如CH4
会增加计数H
和C
一个。)
如何使用ggplot
执行此操作?我可以使用地图吗?
答案 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))
显然有改进的机会,但这应该会给你一个良好的开端。
您可能会寻找更强大的分解函数。看起来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))