2015-03-19 4 views
0

У меня есть список элементарных композиций, и я хотел бы отображать счетчик для количества включений элемента в композицию, отображаемую на периодическую таблицу (например, CH4 увеличит счетчик на H и C на один).Как отображать счеты с использованием периодической таблицы с ggplot?

Как это сделать с помощью ggplot? Есть ли карта, которую я могу использовать?

+0

Я нашел эту страницу, чтобы быть очень полезным: http://chepec.se/2014/11/16/element-data.html – wdkrnls

ответ

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) 

(Вы должны, вероятно, создать свою собственную локальную версию для облегчения загрузки в будущем.)

Тогда ваша другая задача разлагается что-то вроде «СН4» в подсчитывается исходный элемент. Я создал эту вспомогательную функцию, которая, я думаю, делает то, что вам нужно.

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)) 
+1

впечатляет! .... –

+0

Это действительно потрясающе, я опубликую некоторые последующие вопросы, так как я могу использовать это разными способами. – wdkrnls

+0

Обновлено с более надежной возможностью разложения – MrFlick

 Смежные вопросы

  • Нет связанных вопросов^_^