ggplot2 案例:赫羅圖

2021-02-21 RStata

今天的推文是個 ggplot2 案例,不過也是一個動態圖表,在開始敲今天的代碼之前我們先了解一下什麼是「赫羅圖」?

赫羅圖(Hertzsprung-Russell diagram,簡寫為 H-R diagram 或 HRD)是丹麥天文學家赫茨普龍及由美國天文學家羅素分別於 1911 年和 1913 年各自獨立提出的。後來的研究發現,這張圖是研究恆星演化的重要工具,因此把這樣一張圖以當時兩位天文學家的名字來命名,稱為赫羅圖。赫羅圖是恆星的光譜類型與光度之關係圖,赫羅圖的縱軸是光度與絕對星等,而橫軸則是光譜類型及恆星的表面溫度,從左向右遞減。恆星的光譜型通常可大致分為 O.B.A.F.G.K.M 七種,要記住這七個類型有一個簡單的英文口訣 "Oh be A Fine Girl/Guy. Kiss Me!"

上面一段是我百度的。。。

這篇文章的核心代碼來源於 zonination/h-r-diagram 當然我不是直接 Ctrl + C / V 把代碼直接複製過了,我在作者的代碼基礎上進行了更正和改進。

附件(文末有下載連結)中有本文需要的兩個數據:

我們使用 readr 包把這兩個數據集讀入 R 中並使用 rbind 函數進行行連接:

library(tidyverse)
library(ggplot2)
# 讀入數據
# 發現這個數據使用 read_csv 讀取的時候有點問題,ci 和 x 變量錯位了,absmag 和 spect 也錯位了,所以這裡我們選擇 spect 和 x,然後把 x 重命名為 ci,spect 重命名為 absmag
catalog <- rbind(
    read_csv("hygdata_v3-1.csv"),
    read_csv("hygdata_v3-2.csv")
  ) %>%
  select(spect, x) %>%
  rename(ci = x,
         absmag = spect)

通過繪製一系列帶有不同透明度的靜態圖合成動圖就可以產生星星閃耀的效果。為此,我們先生成一列隨機數:

catalog$randomseed <- runif(nrow(catalog), min = 0, max = 2 * pi)

這個隨機數服從

我們先繪製一幅靜態圖:

ggplot(catalog, aes(ci, absmag)) +
  geom_point(
    shape = 16,
    size = 0.001,
    aes(
      alpha = (sin(randomseed + pi / 180)),
      colour = ci
    )
  ) +
  scale_x_continuous(limits = c(-0.5, 2.5)) +
  scale_y_reverse() +
  guides(colour = F, alpha = F) +
  scale_alpha_continuous(range = c(0, 1)) +
  scale_color_gradientn(
    colours = c("blue", "skyblue", "white", "orange", "red"),
    limits = c(-0.5, 2.5)
  ) +
  labs(
    title = "圖:赫羅圖",
    subtitle = "恆星的類別",
    y = "絕對星等",
    x = "光譜類型(B-V)"
  ) +
  annotate("text",
           x = 0, y = 15,
           label = "白矮星", size = 4,
           hjust = 0, vjust = 0, color = "white", family = cnfont
  ) +
  annotate("text",
           x = 1.75, y = 12,
           label = "主序帶", size = 4,
           hjust = 0, vjust = 0, color = "white", family = cnfont
  ) +
  annotate("text",
           x = 1.75, y = 0,
           label = "巨星", size = 4,
           hjust = 0, vjust = 0, color = "white", family = cnfont
  ) +
  annotate("text",
           x = 1.75, y = -10,
           label = "超巨星", size = 4,
           hjust = 0, vjust = 0, color = "white", family = cnfont
  ) +
  theme_modern_rc(base_family = cnfont, grid = "") +
  theme(panel.background = element_rect(fill = '#000000',
                                        color = 'white',
                                        size = 0.2),
        plot.background = element_rect(fill = '#000000',
                                       color = '#000000'))

突然發現我們甚至可以把這幅圖製作成一幅藝術品,為此我們可以把文本、軸線等刪除了:

ggplot(catalog, aes(ci, absmag)) +
  geom_point(
    shape = 16,
    size = 0.001,
    aes(
      alpha = (sin(randomseed + pi / 180)),
      colour = ci
    )
  ) +
  scale_x_continuous(limits = c(-0.5, 2.5)) +
  scale_y_reverse() +
  guides(colour = F, alpha = F) +
  scale_alpha_continuous(range = c(0, 1)) +
  scale_color_gradientn(
    colours = c("blue", "skyblue", "white", "orange", "red"),
    limits = c(-0.5, 2.5)
  ) +
  labs(
   caption = "赫羅圖",
   x = "", y = ""
  ) +
  theme_modern_rc(caption_family = cnfont, grid = "") +
  theme(panel.background = element_rect(fill = '#000000',
                                        color = '#000000',
                                        size = 0.2),
        plot.background = element_rect(fill = '#000000',
                                       color = '#000000'),
        axis.text = element_blank(),
        plot.caption = element_text(hjust = 0, size = 14))
ggsave("赫羅圖.png", height = 9, width = 6)

最後使用 for 循環是生成 37 張透明度不同的圖片然後再合併為 GIF 圖:

for (n in seq(0, 360, 10)) {
  ggplot(catalog, aes(ci, absmag)) +
    geom_point(
      shape = 16,
      size = 0.001,
      aes(
        alpha = (sin(randomseed + n * pi / 180)),
        colour = ci
      )
    ) +
    scale_x_continuous(limits = c(-0.5, 2.5)) +
    scale_y_reverse() +
    guides(colour = F, alpha = F) +
    scale_alpha_continuous(range = c(0, 1)) +
    scale_color_gradientn(
      colours = c("blue", "skyblue", "white", "orange", "red"),
      limits = c(-0.5, 2.5)
    ) +
    labs(
      title = "赫羅圖",
      subtitle = "恆星的類別",
      y = "絕對星等",
      x = "光譜類型(B-V)"
    ) +
    annotate("text",
             x = 0, y = 15,
             label = "白矮星", size = 4,
             hjust = 0, vjust = 0, color = "white", family = cnfont
    ) +
    annotate("text",
             x = 1.75, y = 12,
             label = "主序帶", size = 4,
             hjust = 0, vjust = 0, color = "white", family = cnfont
    ) +
    annotate("text",
             x = 1.75, y = 0,
             label = "巨星", size = 4,
             hjust = 0, vjust = 0, color = "white", family = cnfont
    ) +
    annotate("text",
             x = 1.75, y = -10,
             label = "超巨星", size = 4,
             hjust = 0, vjust = 0, color = "white", family = cnfont
    ) +
    theme_modern_rc(base_family = cnfont, grid = "") +
    theme(panel.background = element_rect(fill = '#000000',
                                          color = 'white',
                                          size = 0.5),
          plot.background = element_rect(fill = '#000000',
                                         color = '#000000'))
  ggsave(paste("star_anim", formatC(n, width = 3, flag = "0"), ".png", sep = ""), height = 9, width = 6)
  print(paste(n, "of", 360, "degrees completed."))
}
rm(n)

# 使用 convert 命令把靜態圖合成動圖
system("convert -delay 10 star_anim*.png twinkle.gif")
# 刪除剛剛繪製並保存的靜態圖
system("rm star_anim*.png")

結果(很大,請耐心等待,這裡我給它轉為 MP4 文件插入,附件中有轉換的代碼):

把多個圖片合成 GIF 圖 可以使用終端命令 convert,如果你的電腦沒有這個工具,可以使用 magick 工具,下載和使用方法可以閱讀這裡:https://www.imagemagick.org/script/command-line-processing.php

附件連結:連結: https://pan.baidu.com/s/14DobGlItoDRN8zHWibQu9g  密碼: ql3u

相關焦點

  • ggplot2繪製時間序列變化圖
    ggplot2繪製時間序列變化圖疫情時間序列變化涉及主要方法:list.files遍歷文件read_excel讀取EXCEL文件圖例等文字格式、文字大小、位置設置geom_smooth平滑曲線繪製geom_point散點繪製library(lubridate)library(ggplot2
  • ggplot2一頁多圖(組合圖)
    第七十八題 2021年2月6日ggplot2
  • R繪圖之ggplot2-散點圖(一)
    使用默認設置之外的點形與顏色將連續型變量映射到點的顏色與大小上處理重疊圖形添加回歸模型擬合線添加模型係數向散點圖添加邊際地毯二、繪圖1.如何使用默認設置之外的點形與顏色   首先我們繪製一張基礎的散點圖library(ggplot2
  • 赫羅圖
    這就是傳說中的赫羅圖。赫羅圖  圖:百度圖片可以看見,絕大多數恆星都分布在從左上到右下的一塊帶狀區域。這意味著它們的光度強烈依賴於溫度[2],溫度越高,光度越強。看來它們是比較「正常」的恆星。不過最值得一提的還是它們那令人膽寒的尺寸,已知最大的巨星盾牌座UY直徑達到了D=2 375 828 000 000 m一枚11km/s的火箭不到2分鐘就能從北京飛到上海,但要7年才能橫穿這顆恆星。
  • 赫羅圖-詮釋恆星的演變
    第三個區域在主星序左下方:是一些溫度高而光度低白矮星,以及其它低光度恆星,第四個區域位於赫羅圖上一個很右的位置:溫度非常冰冷的星際雲在最右邊,當星際雲收縮,它會變得越來越熱,在赫羅圖上的位置亦會向左移動。由星際雲形成的原恆星也在赫羅圖的右邊。赫羅圖是由恆星的光學觀測數據構成的,因此中子星和黑洞不能在赫羅圖上顯現。
  • 赫羅圖的誕生
    20世紀的天文學有一個非凡的成就,這便是將恆星分類的赫羅圖,全稱「赫茨普龍-羅素圖」,那麼赫羅圖是如何誕生的呢?它又傳達給我們怎樣的信息呢?這可能就是接下來兩天我要水的內容了。赫羅圖1814年,德國光學家夫琅禾費利用他的分光鏡發現,在太陽光譜中,有不可計數的、強弱不一的垂直光譜線,它們比背景的顏色暗黑一些,有些譜線差不多是完全暗黑的。他標記的暗線多達500餘條,後人稱之為「夫琅禾費線」。
  • 跟著Nature Genetics學畫圖:R語言ggplot2畫折線圖並添加誤差線
    image.png數據保存為csv格式df<-read.csv("line.csv",header=T)df基本的折線圖library(ggplot2)head(df)ggplot(df,aes(x=time_point,y=value))+  geom_line()+  geom_point()+  ylim(0,40)
  • 跟著Nature Genetics學畫圖~ggplot2畫折線圖並在指定區域添加灰色背景
    從上至下的第一個a<-seq(0,1.5,0.05)df1<-data.frame(x=1:60,y=sample(a,60,replace=T))畫圖library(ggplot2image.png第二個和第一個一樣,這裡就不重複了,接下來是第三個,第三個多了一個灰色背景,這個可以藉助geom_rect()函數實現構造一份數據b<-seq(0,2.5,0.05
  • 鋪墊部分——赫羅圖
    (來源百度百科)上面這個圖就是赫羅圖了。之所以我要從赫羅圖講起,是因為這張圖表示了恆星的光譜與溫度的聯繫。一般來說,恆星演化的總趨勢是這樣的:光譜型表面溫度°C顏色半徑(陽=1)質量(陽=1))光度(陽=1)O38000藍1840500,000B30000藍白7.41820,000A10800白2.5
  • 揭示恆星一生經歷的秘密——赫羅圖
    對宇宙的觀測包括以下七個方面:1、宇宙微波背景輻射 2、膨脹 3、均勻性和各向同性 4、宇宙的年齡 5、輕元素豐度 6、物質密度,宇宙中的暗物質和暗能量 7、宇宙的大尺度結構赫羅圖:把恆星的光度與溫度作出比較是很有意思的。由於恆星的光度依賴於它的溫度和大小,故把它們的光度和溫度作圖比較就能把恆星按體積大小區分開來。
  • 主星序與主序星區別與思考,赫羅圖是否是混沌坐標系呢?
    簡稱赫羅圖由於通常使用光譜的方式來確定星體的表面溫度,因此橫坐標也有畫作光譜型的。赫羅圖是否採用了混沌坐標系?赫羅圖產生於上世紀初,那時候現代數學意義的分形、混沌、分叉理論都未產生,不會考慮坐標軸的混沌性意義問題。在這種數學發展的前提下:對於混沌性的結果,當時的考慮就是:這是一個隨機性體系;而對於線性規律性的發現,就會考慮這是一個決定性數學擬合系統。
  • 細說恆星的一生——從赫羅圖上尋跡恆星的身世
    大家好,歡迎來到小五說科技,世界好大奇妙的事情每一天都有,就讓我們一起去發現,我們今天就來聊一聊赫羅圖,小五覺得單記名詞不重要,最重要的還是要告訴大家它背後的理論到底是什麼,想要弄清楚赫羅圖,就要理順這幾個概念。
  • 「赫羅圖」不僅反映了不同類型恆星的分布特徵也反映了恆星的演化
    黃媂】「赫羅圖「赫羅圖」反映了恆星在溫度和光度圖上並不是隨機分布的,恆星是遵循一定的規律的,天文學家就把這種規律統稱為「赫羅圖」,赫羅圖在恆星的演化的研究中有著舉足輕重的地位,是研究恆星最重要的一張圖,因為它不僅僅反映了不同類型恆星的分布特徵,也反映了恆星的演化。
  • 【E.N.科普專欄】赫羅圖——濃縮恆星的一生
    而這張圖也以二人名字組合命名,叫做「赫羅圖」。從圖上可以看到,太陽在生命的大部分時間裡都在主星序中緩慢移動。在赫羅圖上向右上方移動。接下來,在短暫的時間裡,由於耗盡了燃料,太陽會逐漸剝離它的外殼。這個過程中的溫度極高,亮度也會隨之增加。最終,太陽將走向赫羅圖的左下角,變成了一顆小而熱的白矮星。不知到了那個時候,太陽系還會有幾顆行星存在呢?
  • 讓我點亮你的世界——太陽、恆星的分類及赫羅圖
    本期我們將拜訪我們這位偉大的光明使者,並逐漸過渡到對恆星分類的探討,最後了解赫羅圖,為下一期做好知識儲備。在開始之前,先給大家出一道謎語:誰永遠不會長大?(打一天文現象)(提示:謎底在文中出現。)謎底在文末。
  • 赫羅圖,研究宇宙的「百科全書」,通過這幅圖帶你探索恆星的奧妙
    超巨星另一個極端是小小的紅矮星,它們的直徑大到太陽的一半,小到太陽的1/10,人類目前所知的最小的恆星叫做「2MASSJ05233822-1403022」,它的亮度只有太陽的1/8000,體積比木星還小,但密度比它大!
  • R語言繪圖 | R繪製火山圖 EnhancedVolcano+ggplot
    原來2倍的差異等同於1Log2FC)。一般默認取log2FC絕對值大於1為差異基因的篩選標準。Y軸:-Log(adjust P-value), 對矯正後的P值取負對數(-log);矯正P值為多重假設檢驗矯正過的差異顯著性P值。
  • 主序星到底是什麼 主序星指的是赫羅圖上的恆星
    主序星就是一種分類,指的是在赫羅圖上的恆星,主序星可以看到恆星之間的進化關係,可以看到進化的過程,主序帶就是通過顏色而分辨不同的恆星帶,在主序帶的恆星也就是主序星,主序星就是人命名之後的主序帶。
  • R語言微生物群落數據分析:從原始數據到結果(No2)
    library("phyloseq")library("ggplot2")library