繪製元素周期表

2021-01-20 無安書


繼續用 ggplot2 完成簡單任務:


事實上,類似的功能,已經有用其他語言來完成的了,例如:

https://docs.bokeh.org/en/latest/docs/gallery/periodic.html

以及:

https://plotnine.readthedocs.io/en/stable/generated/plotnine.geoms.geom_tile.html

前者為:Bokeh 的做法,後者為 Plotnine 的做法,而後者其實是 ggplot2 的圖形語法,但細節上還是不同於 R 語言上的 ggplot2. 

在這裡,簡單地做了一下,用 ggplot2 完成了元素周期表的簡單繪製:

theme_set(theme_classic(base_family = 'sourcehan-normal'))

新設置主題以及字體,字體選用思源黑體。

接著,構建數據:

ele <- c("H ",  "He",  
"Li","Be","B ", "C ", "N ","O ","F ","Ne", 
"Na","Mg","Al", "Si", "P ", "S ","Cl", "Ar",
"K ","Ca","Sc", "Ti", "V ", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", 'Kr',
"Rb","Sr","Y ", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I ", "Xe",
"Cs","Ba", "Hf", "Ta", "W ", "Re", "Os", "Ir", "Pt", "Au", "Hg", "TI", "Pb", "Bi", "Po", "At", "Rn",
"Fr","Ra", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "FI", "Mc", "Lv", "Ts", "Og"

num <- c(1:56,72:88,104:118)
f1 <- num
x <- c(1,18,
       1:2, 13:18,
       1:2,13:18,
       rep(1:18,2),
       rep(c(1:2,4:18),2)
       )
y <- c(1,1,
       rep(2,8),rep(3,8),
       rep(4:5,each = 18),
       rep(6:7, each = 17)
       )

 f <- c(1,2,3,4,5,rep(1,3),6,2,
        3,4,7,5,1,1,6,2,
        3,4,rep(8,10),7,5,5,1,6,2,
        3,4,rep(8,10),7,7,5,5,6,2,
        3,4,rep(8,9),7,7,7,5,6,2,
        3,4,rep(8,9),7,7,7,7,6,2
        ) %>%  factor(.,labels = c(
          'nonmetal','noble gas', 'alkali metal', 
    'alkali earth metal', 'metalloid', 'halogen',
    'metal', 'transition metal'
        ) )
 d2 <- data.frame(
   ele, num,x, y ,f
 )

x ,y 對應每一個元素的坐標位置, f 提供分類變量。


之後要生成羅馬數字:

roman_num <- c('\u2160','\u2161','\u2162','\u2163',
                '\u2164','\u2165','\u2166')
 d3 <- data.frame( x = c(rep(0.7,7),1:18+0.5),
                   y = c(1:7+0.5,rep(8.1,18)),
                   label = c(roman_num,1:18)
                  )


然後開始作圖:

ggplot(d2) + 
  geom_rect(aes(xmin = x,ymin = y,
                xmax = x + 0.96,ymax = y + 0.96,
                fill = f),
             size = 0.1
         ) + 
  geom_text(aes(x +0.2,y+ 0.5,label = ele),
            fontface = 'bold',
            hjust  = 0) + 
   geom_text(aes(x = x+0.05, y = y + 0.2,label = num),
           vjust = 0.5 ,hjust = 0,
           size = 3) +
   geom_text(aes(x = x,y = y,label = label ),
             d3,  family = 'sourcehan-light',
             hjust = 0.5,vjust = 0.5) + 
  scale_y_reverse() + 
  theme_void() + 
  scale_fill_discrete(NULL,
      labels = function(x) str_pad(x,25,'right')
  )  + ggtitle('  Periodic table')

需要說明的是: function(x) str_pad(x,25,'right') 在右側添加空白,避免圖例直接與右側邊界對齊。

圖像:


這樣顯示的,是 ggplo2t 的默認配色,感覺上非常不美觀。。。



因此,需要修改顏色:

ggplot(d2) + 
      geom_rect(aes(xmin = x,ymin = y,
                    xmax = x + 0.96,ymax = y + 0.96,
                    fill = f,colour = f), alpha = 0.45,
                size = 0.1
      ) + 
      geom_text(aes(x +0.2,y+ 0.5,label = ele),
                fontface = 'bold',
                hjust  = 0) + 
      geom_text(aes(x = x+0.05, y = y + 0.2,label = num),
                vjust = 0.5 ,hjust = 0,
                size = 3) +
      geom_text(aes(x = x,y = y,label = label ),
                d3,  family = 'sourcehan-light',
                hjust = 0.5,vjust = 0.5) + 
      annotate('text', y = 6:7+0.6,x = c(3,3)+0.5,
               label = c('LA','AC'),
               hjust = 0.5,vjust = 0.5) + 
      scale_y_reverse() + 
      theme_void()  -> p1

在 p1 中增加了 LA, AC 的位置,但沒有添加顏色。


接著修改配色部分:

 p1 + scale_fill_discrete(NULL,
            type =   list (c('#F1D4AF',
        '#EAEAEA','#A6CEE3','#1F78B4',
        '#E08D49','#999D9A','#D93B43',
        '#599D7A')  )
   )  +
      scale_colour_discrete(NULL,
         type =   list (c('#F1D4AF',
            '#EAEAEA','#A6CEE3','#1F78B4',
            '#E08D49','#999D9A','#D93B43',
            '#599D7A')  )
      )

新版 ggplot2 的配色修改,是通過 type 參數完成,傳入部分可以為 list 對象。

而顏色的深淺,則在 p1 中通過 alpha 參數進行調整

接著再修改圖例,以及標題部分:

 p1 + scale_fill_discrete(NULL,
            type =   list (c('#F1D4AF',
        '#EAEAEA','#A6CEE3','#1F78B4',
        '#E08D49','#999D9A','#D93B43',
        '#599D7A')  )
   )  +
      scale_colour_discrete(NULL,
         type =   list (c('#F1D4AF',
            '#EAEAEA','#A6CEE3','#1F78B4',
            '#E08D49','#999D9A','#D93B43',
            '#599D7A')  )
      ) +   
      ggtitle('  Periodic Table') + 
     guides(fill = guide_legend(
       nrow = 1
     )) + 
     theme(
       legend.position  = c(0.5,0.9),
       plot.title = element_text(
          hjust = 0.05, vjust = -0.3
       )
     )

至此,已完成基本的繪圖。如果需要添加元素的全寫名稱,以及相對分子質量,可類似地操作,繼續添加 geom_text() 圖層即可。


此外,也可以繼續添加 LA, AC 系的元素。

這樣的繪圖相對比較簡單,難度不大。

---end---

相關焦點

  • 元素周期表錯了?
    元素周期表從百年前起就一直是化學課的重要內容之一,但是最近科學家發現有個稀有元素他們可能從一開始就擺錯了,這意味著元素周期表得重畫。被命名為鐒的放射性元素位於化學元素周期表最底端,屬於錒類元素一欄,而這一欄專門從主表中單獨歸類出來。
  • 一張不一樣的元素周期表
    ——卡爾·薩根2016年的時候,有四個新元素獲得了元素周期表的永久席位。它們分別是原子序數為113號的「Nihonium」、115號「Moscovium」、117號「Tennesine」和118號「Oganesson」。下面這張元素周期表就是我們所熟悉的:△ 最新版本的元素周期表,包括了四個最新的元素。(圖片來源:IUPAC by C.
  • 元素周期表新玩法
    但是,人們對周期表上的所有元素是否都已排在最合適的位置,不是沒有疑問的。正如音符可以以各種方式排列產生音樂一樣,元素之間的關係也可以用不同的方式來描述。判斷哪一種更好,哪一種更真實,有時並非一件容易的事情。因此,對於當前周期表中某些元素排列,至今仍爭議不斷;一些化學家甚至主張用更激進的方法重新設計元素周期表。
  • 2015移動開發工具「元素周期表」
    19世紀,俄國化學家德米特裡·門捷列夫排列原子量卡片時,發現了世界上第一份元素周期表,用以展現當時宇宙中已知元素特性的周期性。至今,這份長方形的表格在人類認識自然、改造自然、徵服自然的鬥爭中發揮了巨大的作用。
  • 化學秘籍之元素周期表
    「氫氦鋰鈹硼,碳氮氧氟氖……」化學元素周期表可以說是化學研究及學習的神級「武功秘籍」,為我們學習化學提供了很好的幫助,那麼你是否知道它的起源與演變呢?他對當時已知的62個元素的原子量按遞增順序排列,發現元素的性質存在著周期性的重複,每八個元素為一周期。1869年,俄國化學家門捷列夫製作了一張周期表,這張表格是化學研究歷史上最重要的一份研究成果。據說,在那年的一個夜晚,門捷列夫夢見已知的63種化學元素一一對應地落在格子裡,構成了一張鱗次櫛比的表格。一夢驚醒,他立即將夢中的表格還原,製成了第一張元素周期表。
  • 元素周期表
    認為門捷列夫完全按照原子量遞增的順序排列元素周期表是不妥的。
  • 元素周期表51號元素是什麼梗?元素周期表51號元素是啥
    元素周期表51號元素是什麼梗?抖音真的是可以了,終於還是向元素周期表下手了!在網上經常能看到有關元素周期表51號元素的梗,那麼大家知道元素周期表51號元素是什麼梗嗎?下面就快和小編一起看看吧!元素周期表51號元素是什麼梗元素周期表51號元素是什麼?有點文化的應該是知道的吧!
  • 元素周期表口訣 如何快速記憶元素周期表
    元素周期表口訣 如何快速記憶元素周期表很多學生覺得元素周期表很難背誦,想知道怎麼才能快速記憶元素周期表,下面小編為大家介紹一下元素周期表口訣快速記憶法。快速記憶元素周期表的方法諧音記憶周期表的具體方法如下:一、按周期記憶第一周期:「氫氦」。諧音:「輕嗨!」
  • 元素周期表中隱藏了80年的惡作劇之元素鈽(Pu)
    元素周期表這個元素是「鈽(Pu)」。「鈽(plutonium)」以冥王星 (Pluto) 名字命名。1940年,美國化學家格倫·西博格 (Glenn Seaborg) 的同事發現93號元素「錼」。而他想到了「鈽」這個名字,當時,冥王星是太陽系中被發現最年輕且最小的一顆行星。
  • 元素周期表的來源
    大家好,歡迎收看我的百家號科技代替生活,今天小編要給大家的介紹的是元素周期表的來源。元素周期表現如今,世界各地的學生都會背元素周期表,它被許多人視為化學領域最偉大的發現。似乎隨著原子質量的增加,元素屬性會發生周期性的變化。例如,表中最左邊的一列中包含鈉(Na)、鉀(Li)和鋰(K)三種元素,它們在室溫條件下都是固態,都很活潑,熔點低,暴露在空氣中會失去光澤。相形之下,最右列的元素在室溫下都是氣態,並且無色、無味,極其不活潑。表中的列稱為族,行稱為周期。1869年,門捷列夫發表了自己的元素周期表。
  • 化學元素周期表口訣 怎樣記憶元素周期表
    化學元素周期表口訣 怎樣記憶元素周期表化學元素周期表是學好化學的基本內容,想要學好化學一定要對化學元素著重記憶,下面小編為大家提供化學元素周期表的記憶方法,僅供大家參考。化學元素周期表內容在周期表中,元素是以元素的原子序排列,最小的排行最先。表中一橫行稱為一個周期,一列稱為一個族。
  • 化學 | 元素周期表,你了解有多少?
    (元素周期表注音版)來,先聽聽歌,看個視頻吧。
  • 【化學】元素周期表
    元素周期表有7個周期,16個族。每一個橫行叫作一個周期,每一個縱行叫作一個族。
  • 元素周期表及原子團
    一、專題檢測1、默寫元素周期表前20號元素(見知識梳理)2、默寫常見原子團的化合價(見知識梳理)15、其最高價氧化物的水化物酸性最強的元素是Cl16、其單質是最易液化的氣體的元素是Cl17、其氫化物沸點最高的非金屬元素是 O18、常溫下其單質有顏色氣體的元素是F、Cl【知識點2】元素符號和元素周期表
  • 設計感爆棚的元素周期表
    單調而又普通的周期表淡然沒有什麼意思,那如果遇到那些又好看又有趣的元素周期表呢?下面我們就來看一看吧~1.美國Life雜誌在1949年5月發布的一張螺旋形狀的元素周期表 2. 迪斯尼製作的元素周期表 5. 聖塔克拉拉大學Sheehan教授製作的顯示各元素豐度的周期表(面積越大代表該元素在地球的含量越高)
  • 元素周期表見過嗎?一座樓那麼大的「限量版」!
    「氫氦鋰鈹硼,碳氮氧氟氖……」還記得被化學元素周期表支配的恐懼嗎?你記憶中掛在中學牆上的元素周期表,是不是長這樣?加粗的框線,反差過大的區域色彩,中文不認識,英文記不住……你可能想不到,元素周期表還能長這樣↓為迎接5月18日至19日的中國科學院第十五屆公眾科學日,同時也紀念門捷列夫版化學元素周期表誕生150年,中科院化學所把包含了118個元素的最新版元素周期表,重新設計,一格一格,貼滿了這幢10層的實驗樓。
  • 一輪複習||元素周期表
    2.結合有關數據和實驗事實認識原子結構、元素性質呈周期性變化的規律,建構元素周期律。 3.知道元素周期表的結構,以第三周期的鈉、鎂、鋁、矽、硫、氯以及鹼金屬和滷族元素為例,了解同周期和主族元素性質的逆變規律。
  • 幻書啟世錄幻書元素周期表介紹 元素周期表好不好
    《幻書啟世錄》中,元素周期表是其中一個幻書角色,那么元素周期表什麼樣子?看下《幻書啟世錄》幻書元素周期表介紹吧。
  • 元素周期表的終點在哪裡?
    1869年俄國化學家門捷列夫將當時已發現的63種元素列成元素周期表,並留下一些空格,預示著這些元素的存在。在元素周期表的指導下,人們「按圖索驥」找出了這些元素。元素種類到底是否有限?周期表是否有終點?20世紀30~40年代,人們發現了92號元素,就有人提出92號是否是周期表的最後一種元素。然而從1937年起,人們用人工合成法在近50年時間又合成出20多種元素,元素周期表的尾巴增長了。這時又有人預言,105 號元素該是周期表的盡頭了,其理由是核電荷越來越大,核內質子數也越來越大,質子間的排斥力將遠遠超過核子間作用力,導致它發生蛻變,然而不久,又陸續合成了106~109號元素。
  • 元素周期表150歲了!你知道手機正在威脅表中元素嗎?
    到2019年,那些年折磨過我們的化學元素周期表就150歲了。1869年,俄羅斯科學家門捷列夫首次出版了類似於現代版元素周期表的周期表。為此,聯合國教科文組織(UNESCO)在兩年前就將2019年定為「化學元素周期表國際年」,將用一整年時間開展各類活動,紀念元素周期表誕生150周年。