wdk*_*nls 0 r chemistry ggplot2
我有一个元素组成列表,我想显示一个元素包含在映射到周期表的组合中CH4的次数(例如, 会增加计数H和C一个).
我怎么能这样做ggplot?我有可以使用的地图吗?
通过一些搜索,我在此示例代码项目中找到了有关元素周期表的信息.他们有一个包含元素信息的Access数据库.我把它出口到了这个要点.您可以使用httr库导入数据
library(httr)
dd <- read.table(text=content(GET("https://gist.githubusercontent.com/MrFlick/c1183c911bc5398105d4/raw/715868fba2d0d17a61a8081de17c468bbc525ab1/elements.txt")), sep=",", header=TRUE)
Run Code Online (Sandbox Code Playgroud)
(您可能应该创建自己的本地版本,以便将来更轻松地加载.)
然后你的另一个挑战是将"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)
}
Run Code Online (Sandbox Code Playgroud)
在这里我测试功能
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
Run Code Online (Sandbox Code Playgroud)
现在我们可以将数据和参考信息结合起来制作情节
library(ggplot2)
ggplot(merge(decompose("CH4"), dd), aes(Column, -Row)) +
geom_tile(data=dd, aes(fill=GroupName), color="black") +
geom_text(aes(label=Freq))
Run Code Online (Sandbox Code Playgroud)

显然有改进的机会,但这应该给你一个良好的开端.
您可能会寻找更强大的分解函数.看起来这个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))
Run Code Online (Sandbox Code Playgroud)