偏摩爾體積測試-繪圖的後續細節

2021-02-08 無安書


在 偏摩爾體積測定-數據處理 中基本完成了數據處理,解決了切線以及截距值的添加,但這樣的圖,始終還是少了點東西。因此,在原來的基礎之上:

q1 + q2 + q3 + q4 + q5 + q6 +
  plot_layout(ncol = 3,byrow = F) + 
  plot_annotation(tag_levels = 'a',
                  tag_suffix = ')',
                  title = '偏摩爾體積的測定',
                  caption = '2020/10/27',
                  theme = theme(plot.title = element_text(
                    family = 'op_m'
                  ),
                  plot.caption = element_text(
                    family = 'op_m'
                  ))
                  )

圖像:


首先: 由於一直以來都是採用 theme_classic() 作為基礎主題來改造。而 ggplot2 默認橫縱坐標軸在末端處有所延長,並不會直接相交,這也就是為什麼 x = 0 處為什麼不是 y 軸,而需要自行添加虛線來顯示切線的交點,即對應的截距值。同時 右側也不顯示 第二個 y 軸,即達到雙坐標軸的設想。同時,按理來說,把「水」、「乙醇」這兩個標籤放到坐標軸以外的範圍來顯示會更加合理一些,更能符合通用的習慣。

因此,先解決橫坐坐標軸不能直接相交的問題:

ggplot(dd, aes(x,y)) + 
  geom_point() + 
  geom_line(data = xsp(dd,n)) + 
  labs(x = expression(G[2]),y = expression(frac(1,rho))) +
  scale_x_continuous(breaks = seq(0,1,by = 0.2),
                     limits = c(0,1),
                     expand = c(0,0)) + 
  scale_y_continuous( sec.axis = sec_axis(~. ,
        name = expression(frac(1,rho))
  ))

圖像:

這一塊,通過 scale_x_continuous() 的 expand 參數來控制擴展的範圍,將值設置為 c(0,0) 即避免了兩端出現延長。但這種方式並不是 「True or False」的方式, y 軸 也需要通常操作才能完成,因此,這裡就需要更加快速地完成 expand 的設置。

coord_cartesian(
xlim = NULL,
ylim = NULL,
expand = TRUE,
default = FALSE,
clip = "on"
)

而坐標軸的控制,則是由 coord_xx 系列函數來完成。常規使用的為直角坐標系,因此,改用 coord_cartesian() 函數,其中參數 expand 值為邏輯值,僅能選擇 true 或 false, 這樣的話,來開啟全局控制,一次性避免坐標軸延長擴展範圍。

同時另一個參數:clip = 'on' 也是接下來需要使用到的參數。

ggplot(dd, aes(x,y)) + 
  geom_point() + 
  geom_line(data = xsp(dd,n)) + 
  coord_cartesian(expand = F) +
  labs(x = expression(G[2]),y = expression(frac(1,rho))) +
  scale_x_continuous(breaks = seq(0,1,by = 0.2),
                     limits = c(0,1)
                ) + 
  scale_y_continuous( 
                    sec.axis = sec_axis(~. ,
        name = expression(frac(1,rho))
  )) 

圖像:


但這樣的後果是:兩端的點直接被坐標軸或是邊界掩藏了一半的內容,這顯示是不合理的,因此開始 expand  = F 後,需要手動改變坐標軸範圍來延長區域,以顯示所有的點並避免坐標軸重疊!

而第二坐標軸,則由 scale_y_continuous() 中的 sec.axis 來控制,其接受 sec_axis() 函數的設定值。這一點,可以通過該函數的幫助信息來詳細地了解,因此不再一一闡述。

所以,接下來要做的就是改善坐標軸範圍,接下來嘗試添加繪圖區域以外的問題(這取決於第二個參數 clip)


但是,這裡面仍然有注意事項:

ggplot(dd, aes(x,y)) + 
  geom_point() + 
  geom_line(data = xsp(dd,n)) + 
  coord_cartesian(clip = 'off',expand = F) +
  labs(x = expression(G[2]),y = expression(frac(1,rho))) +
  scale_x_continuous(breaks = seq(0,1,by = 0.2),
                     limits = c(0,1)
                ) + 
  scale_y_continuous( sec.axis = sec_axis(~. ,
           name = expression(frac(1,rho))
  )) + 
  annotate('label',x = 0:1, y = 0.78,
           label = c('水','乙醇'),
           hjust = c(0,1)) 

圖像:

問題出在:clip = 'off' 即意味著:可以在繪圖區域以外的可見區域內添加數據點或其他內容,只要可見即可,但是:上面的圖中,顯示是以 label 的縱坐標值作為繪圖區域的縱坐標下限來使用,這樣的話,文本依然在繪圖區域內部,而不能達到想要的效果。

但,給 scale_y_continuous() 添加坐標軸範圍後:

scale_y_continuous(limits = c(0.84,1.3),...)

Warning message:
Removed 2 rows containing missing values (geom_label). 


返回的警告信息,已經說明了:此時會移除 label 信息,及原有的 label 圖層無法被添加,已經被自動移除。因此,這種做法,顯然是不合理的。所以在改變 clip 的值時,必須在 coord_cartesian() 中添加 ylim 的值!

即:

ggplot(dd, aes(x,y)) + 
  geom_point() + 
  geom_line(data = xsp(dd,n)) + 
  coord_cartesian(ylim = c(0.84,1.3),clip = 'off',expand = F) +
  labs(x = expression(G[2]),y = expression(frac(1,rho))) +
  scale_x_continuous(breaks = seq(0,1,by = 0.2),
                     limits = c(0,1)
                ) + 
  scale_y_continuous( sec.axis = sec_axis(~. ,
           name = expression(frac(1,rho))
  )) + the() +
  annotate('label',x = 0:1, y = 0.78,
           label = c('水','乙醇'),
           hjust = c(0,1))  


但,這樣的圖:

不顯示警告信息,但依舊沒有顯示這兩個標籤,問題只能出在下端的距離上。

plot.margin:
margin around entire plot (unit with the sizes
of the top, right, bottom, and left margins

plot.margin 用於控制 plot 區域距離四周邊界的大小,其接收 margin() ,用於對 距離頂端、右側、底部、左側區域的空白間隔進行設置,很顯然上面的圖中底部空白間隔太小,從而導致 label 無法顯示,因此改為:

margin(t = 0, r = 0, b = 0, l = 0, unit = "pt")

margin() 默認的單位為 pt, 這一點需要注意。

ggplot(dd, aes(x,y)) + 
  geom_point() + 
  geom_line(data = xsp(dd,n)) + 
  coord_cartesian(ylim = c(0.84,1.3),clip = 'off',expand = F) +
  labs(x = expression(G[2]),y = expression(frac(1,rho))) +
  scale_x_continuous(breaks = seq(0,1,by = 0.2),
                     limits = c(0,1)
                ) + 
  scale_y_continuous( sec.axis = sec_axis(~. ,
           name = expression(frac(1,rho))
  )) + the() +
  annotate('label',x = 0:1, y = 0.78,
           label = c('水','乙醇'),
           hjust = c(0,1))  + 
  theme(plot.margin =  margin(4,4,60,4))

在最後,添加 theme(plot.margin = margin(4,4,60,4)) 來擴大底部空白部分的高度:


這一處的調整,通常是不斷調整參數,運行後來得到合適的效果。暫時沒有辦法可以一次調節到位。

接下來的操作,就類似於之前,添加切線和截距值。

完成 p1, p2, p3, p4, p5, p6 的繪圖後,繼續拼圖:

q1 + q2 + q3 + q4 + q5 + q6 +
  plot_layout(ncol = 3,byrow = F) + 
  plot_annotation(tag_levels = 'a',
                  tag_suffix = ')',
                  title = '偏摩爾體積的測定',
                  caption = '2020/10/27',
                  theme = theme(plot.title = element_text(
                    family = 'op_m',size = 16
                  ),
                  plot.caption = element_text(
                    family = 'op_m',size = 14
                  ))
                  )

ggsave('mole-2.pdf',width = 297,height = 210,
       units = 'mm',scale = 1.1)
PNG('vm-A.pdf','A.png')

圖像:

保存為 A4 紙張大小便於直接列印,同時 利用 scale 參數來控制縮放比例,以避免文本重疊。到此,這樣的圖,可能會更加符合日常習慣。


要點: 

1/ 切線的添加

2/ 雙坐標軸圖的建立

3/ 繪圖區域以外的範圍內添加內容,該如何顯示?

既要關閉 clip , 又要不斷地修改 plot.margin 的值!

4/ patchwork + ggsave() 的 scale 參數的使用



以上實際問題,其實提醒了我們:

當你逐漸習慣了 ggplot2 的便捷性的時候,一旦遇到 ggplot2 無法直接解決的問題,你就只能「沮喪 + 無助」. 要善於利用一些方法來實現更多的功能,並且善於查閱幫助文檔來更加全面地掌握 ggplot2 的不被注意的參數以及功能。

最近,想到的 ggplot2 暫時無法支持的功能:

低水平繪圖函數(二)中展示了一幅:

f <- function(x) 2*x^2
plot(f,-3,3,ylim =c(0,20),bty = 'l')
x1 <-  seq(-1,2,0.01)
y1 <- lapply(x1,f)
xt <- c(-1,x1,2)
yt <- c(-.8,y1,-.8)
polygon(xt,yt,density =14)

polygon(x1,y1, col ="tomato")

圖像:


這裡面的多邊形,有一個很重要的參數:density = 14, 決定了填充的線條的密度,以及默認線條方向為:45度角。

而 ggplot2 的解決辦法為:

l1 <- data.frame(x = x1, y = map_dbl(x1,f))
l2 <- data.frame(x = xt, y = as.numeric(yt))
ggplot(l1,aes(x,y)) + 
  geom_polygon(fill = 'tomato') + 
  geom_polygon(data = l2,
               fill = 'grey78')

圖像:

但問題是,並不能添加紋理,即原圖中的 45度角方向的直線構成的圖案,僅僅是通過 顏色、填充色、線條類型、透明度等來做出改變。類似的更為多樣化的紋理填充,就更不能支持。


density :
the density of shading lines, in lines per inch.
The default value of NULL means that no shading 
lines are drawn. A zero value of density means no 
shading nor filling whereas negative values and NA
suppress shading (and so allow color filling).


事實上,一方面這樣的需求並不多見,往往見於很久很久之前的作圖要求中,現在的話,一般都不會選擇做黑白圖像,所以這樣的需求,並不是很頻繁。

其次,目前全部使用 R base 來繪圖的,已經越來越少見。很多人都已經忘記了 polygon() 還有這樣的功能,這並不是說,我們就應該拐回去,重新學習低水平繪圖函數。但這仍是 ggplot2 無法做到的一個功能。


或許,以後真的會有可以直接添加陰影效果的解決方案。正像 ggplot2 當初推出第二坐標軸的解決方案一樣,以及能夠在繪圖區域以外的範圍顯示其他的內容。。。

遇到 ggplot2 不能實現的需求,往往就只能「哭泣」,這也是沒辦法的事,因此,習慣就好。 加切線就是一個需要自己想辦法的挑戰。

---end---


相關焦點

  • 氣體摩爾體積
    【學習重點 】1.掌握氣體摩爾體積的概念; 2.有關氣體摩爾體積的計算;
  • 第2課時 氣體摩爾體積
    ②氣態物質分子間的距離    分子本身的直徑,在分子數相同(比如1mol)的條件下,其體積主要決定於    ,而分子間的距離與    、    有密切關係,在溫度、壓強相同的條件下,各氣體分子間的距離    ,因而,在相同的溫度和壓強下,粒子數相同的任何氣體都具有    的體積知識點2.氣體摩爾體積氣體摩爾體積    叫氣體摩爾體積
  • 名師精講|第1講 物質的量和氣體的摩爾體積
    二、氣體摩爾體積1.影響物質體積的因素影響物質體積的因素有粒子數目的多少,粒子大小,粒子間距離。2、物質的狀態:考查氣體摩爾體積時,命題者常用在標準狀況下一些易混淆的液體或固體作「氣體」來設問,迷惑考生。如標準狀況下,水(液態)、SO3(固態)、CCl4(液態)、甲苯(液態)、戊烷(液態)等。這樣也不能應用「22.4L/mol」進行計算。
  • 12年後再入《摩爾莊園》手遊!重溫童年,快樂源泉,不見不散!
    還記得在微博上有一個關於「摩爾莊園十一歲生日」的話題,點開內容看了一會很多摩爾的真情實感,眼角不知不覺已溼潤,一時五味雜成,思緒更是被拉回那個單純、無憂無慮、快快樂樂在摩爾莊園裡的日子。讓小爆哥覺得美好的東西總是這麼快就溜走,但卻在我們的回憶裡留下了這麼深刻的印記。近期,小爆哥有幸獲得進入到《摩爾莊園》手遊版,重溫童年的快樂。
  • 摩爾質量的計算公式
    物質的量濃度就是單位體積內物質的摩爾數,
  • 摩爾莊園手遊NPC摩爾大全 有哪些NPC摩爾
    標籤: 黑森林 大家好,摩爾莊園手遊NPC有哪些人物?摩爾莊園NPC人物都認識嗎?摩爾莊園NPC人物長什麼樣子?摩爾莊園NPC人物有哪些特點?這些小摩爾們都清楚嗎?呵呵~今天就讓小編介紹幾個重要的NPC們,一起來看看吧。
  • 材料、化學領域常用的十六大繪圖軟體
    軟體介紹:Origin具有兩大主要功能:數據分析和繪圖。Origin的數據分析主要包括統計、信號處理、圖像處理、峰值分析和曲線擬合等各種完善的數學分析功能。
  • 清代孫溫繪圖本《紅樓夢》的精美細節
    而在他身後,另一位文人更是花費三十多年時間為《紅樓夢》繪圖,同樣付出了全部的心血,成就了另外一部巨著《清孫溫繪全本紅樓夢圖》。孫溫繪全本《紅樓夢》現存畫面總計230幅,以繪畫的形式表現了千古奇書《紅樓夢》的主要情節。
  • 《摩爾莊園》12年周年慶&首測曝光:過去的時光是割捨不下的回憶
    官方曝光:《摩爾莊園》手遊將於5月開啟安卓版限量技術性測試!現在來快爆預約,屆時我們將會提供一批資格!現在官方已經在快爆論壇開啟活動,參與活動即有機會獲得資格哦!快來參加吧!轉眼之間,一輪年歲過去了,很難相信《摩爾莊園》和我們已經相處了12年,雖然我們沒有時刻相處,不過依然留下了深刻的烙印,時至今日回憶起來,眼角不知不覺已溼潤,一時五味雜成,思緒更是被拉回那個單純、無憂無慮、快快樂樂在摩爾莊園裡的日子。
  • 每周新手遊推薦:《仙境傳說RO》新作開測 《摩爾莊園》經典回歸
    【17173新聞報導,轉載請註明出處】在5.18-5.25這一周上線或測試的遊戲中,既有《未定事件簿》、《螺旋風暴》這樣大家都很熟悉的老朋友,也有《摩爾莊園》這樣讓人沉浸在回憶裡的老IP,更是有不少
  • 《摩爾莊園》手遊公測延期公告
    各位親愛的小摩爾,商務及渠道合作夥伴:這個春節,我們無法一起在摩爾莊園手遊過年了。  在籌備遊戲公測的過程中,我們遇到了一個突發底層代碼問題, 導致遊戲卡頓、bug、閃退等問題頻發,在共研服測試的小摩爾們都遇到了上述問題,目前我們已經定位到了這一問題,但仍需要花費較多時間解決。  同時這個突發問題的出現打亂了我們春節前上線的籌備計劃,所以原定於春節前上線的不得不延期,具體上線時間待定。
  • 《摩爾莊園手遊》首測正式定檔5月22日,快爆專屬測試資格招募中
    盼星星盼月亮,有生之年系列之《摩爾莊園》手遊終於曝光將在5月22日開啟首次測試。想要測試資格怎麼辦?那就來好遊快爆參與專屬資格申請招募活動吧!例如「電視機」,我們可以通過收看電視來了解摩爾莊園的天氣情況,電視裡播報的天氣會跟莊園的天氣相對應哦~>>小遊戲逛累了莊園,我們還可以在《摩爾莊園》裡開啟小遊戲的戰鬥~連連看、對對碰這些休閒小遊戲,也是我們童年的一部分啊
  • 回到摩爾莊園
    跨進門,聯上微博,就邁進了屬於他的另外一重身份——摩爾莊園超話主持人。 《摩爾莊園》是星夜接觸的第一款網路遊戲。在遊戲中,玩家扮演一隻滾圓可愛的小鼴鼠,在一個名叫「摩爾莊園」的虛擬世界裡探索與遊戲。遊戲面向6~14歲兒童,具有很強的社交屬性,在2008年5月上線後迅速席捲網絡,被稱為「兒童版『開心網』」與「全國最大的兒童虛擬社區」。
  • 【氣密性測試】PHI氣密性檢測的淨體積應該怎麼算
    關於淨體積如何定義,不同的標準會不一樣,這兒主要和大家聊一聊PHI的氣密性測試對淨體積的要求。仍然以問答的形式來闡述。第一問始終是最重要的,被動房的知識點固然多,但每個點都不是獨立的,假如有興趣你們可以一個個的把它串起來,然後一拉就是一串,這兒我們雖然只說淨體積的事,但是有必要先把氣密性和大家說一下,也就是截一段出來。這樣更容易去理解被動房為什麼要這麼定義淨體積。
  • 農場模擬享受最初的美好,12年過去了《摩爾莊園》裡還好嗎?
    隨著Marvelous《牧場物語OL》手遊和《星露谷物語》移動版的推出,淘米網絡手中的經典IP《摩爾莊園》也即將在2020年3月開啟首次技術性測試,具體測試時間及測試細節待定。作為12年前國人的經典回憶,《摩爾莊園》的地位如同國外友人對於《牧場物語》一般。
  • 《摩爾莊園》手遊皇家彩球禮怎麼玩
    《摩爾莊園》手遊皇家彩球禮怎麼玩 《摩爾莊園》手遊皇家彩球禮怎麼玩?具體的玩法是什麼呢?
  • 【隨身繪圖「神器」!!】Astropad讓 iPad 變身專業繪圖平板
    為專業的藝術家和設計師等創意人員提供了第二屏解決方案,它不僅在iPad上提供了高質量、高幀率的鏡像供繪圖使用,還更進一步集成了三個最暢銷的iPad壓敏手寫筆以配合Mac上的應用程式(Wacom的Creative Stylus、Adonit的Jot Touch和Jaja Hex3)。
  • 細節不容錯過,體積值得青睞:Benks 20W迷你PD快充評測
    其實邦克仕家的Benks 20W PD充電器已經上市啦,確實顏值高、體積小。我們也買來進行測試、拆解,今天咱們就來聊聊這款Benks 20W充電器,下面一起看看吧!小編非常喜歡這個小心思,首先是充電器插上後有一個明顯的感知,其次廠商願意在細節下工夫,說明對產品和設計是有追求的,用起來也會更放心。
  • 400w預約、TapTap9.6分,那個陪伴玩家12年的《摩爾莊園》出手遊了
    現在,這款由淘米遊戲開發,雷霆遊戲發行的《摩爾莊園》手遊在9月9日已經開啟了第二次測試(社交玩法測試),眾所周知社交玩法是《摩爾莊園》非常核心的一環,自然此次測試也相當重要。儘管有些不太一樣,但還是可以理解,農場在此次社交測試中起到的作用可以說是非常關鍵。「特產香蕉小龍蝦,香蕉已熟,來波好友~」在遊戲的聊天室中我們幾乎可以經常看見這樣的吆喝,初來乍到的摩爾可能丈二和尚摸不著頭腦,但其實並不難理解。
  • 摩爾莊園任務檔案女神伊莉絲
    摩爾莊園任務檔案女神伊莉絲 庫拉被孤零零地扔在了神殿彩虹橋了,看來神都是不可信的,可是他為什麼會成為神殿守護著呢?有沒有興趣去一探究竟呀? 摩爾莊園手遊 類型:休閒 平臺:安卓 狀態:即將測試 安卓版暫無下載   蘋果版暫無下載