【R>>ggprism】Graphpad Prism繪圖風(fēng)格

做科研的Graphpad Prism是避不開的一道關(guān)炎码,那么是否可以用R來實現(xiàn)其繪圖風(fēng)格呢?在微信公眾號例竟然發(fā)現(xiàn)一篇好文秋泳,《一行代碼繪制Graphpad Prism風(fēng)格學(xué)術(shù)表》潦闲,下面就來一起學(xué)習(xí)下吧,接下來是對這篇推文的記錄和整理迫皱,原文鏈接在文末:


乍一看歉闰,該R包的圖標(biāo)就有濃濃的Graphpad風(fēng)辖众。

核心函數(shù):

  • theme_prism():繪圖主題

  • scale_colour/fill/shape_prism():顏色、填充和敬、形狀

  • scale_x/y_discrete/continuous(guide = “prism_bracket”):刻度設(shè)置 或者guides(y/x=“prism_bracket”)

  • add_pvalues():自動添加p值

安裝

library(pacman)
p_load(ggprism)
p_load(tidyverse)

#開發(fā)者版本
#remotes::install_github("csdaw/ggprism")

快速入門

tg <- ToothGrowth
tg$dose <- as.factor(tg$dose)
base <- ggplot(tg,aes(dose,len))+
  geom_violin(aes(color=dose,fill=dose),trim=F)+
  geom_boxplot(aes(fill=dose),width=0.2,color="black")+
  scale_y_continuous(limits = c(-5,40))

p_vals <- tibble::tribble(
  ~group1, ~group2, ~p.adj,   ~y.position,
  "0.5",   "1",     8.80e-14, 35,
  "0.5",   "2",     1.27e-7,  39
)
p1 <- base+
  scale_color_prism("floral")+
  scale_fill_prism("floral")+
  guides(y="prism_offset_minor")+
  theme_prism(base_size=16)+
  theme(legend.position = "none")+
  add_pvalue(p_vals,label = "p = {p.adj}", tip.length = 0,label.size = 4)

#快速拼圖
library(patchwork)
base+p1
image.png

p值添加

考慮到科研中大家最常關(guān)注的就是p值凹炸,下面把關(guān)注點著重放在pvalue上面:

模板一

p_load(rstatix)
df_p_val <- rstatix::t_test(tg,len~supp) %>% 
  add_x_position()
p <- ggplot(tg, aes(factor(supp),len))+
  stat_summary(geom = "col",fun=mean)+
  stat_summary(geom = "errorbar",
               fun=mean,
               fun.min = function(x) mean(x)-sd(x),
               fun.max = function(x) mean(x)+sd(x),
               width=0.3)+
  theme_prism()+
  coord_cartesian(ylim=c(0,35))+
  scale_y_continuous(breaks = seq(0,35,5),expand = c(0,0))
p+add_pvalue(df_p_val,y.position =30)
image.png

模板二

df_p_val <- rstatix::t_test(tg,len~dose,ref.group = "0.5") %>% 
  add_xy_position()
p <- ggplot(tg, aes(factor(dose),len))+
  stat_summary(geom = "col",fun=mean)+
  stat_summary(geom = "errorbar",
               fun=mean,
               fun.min = function(x) mean(x)-sd(x),
               fun.max = function(x) mean(x)+sd(x),
               width=0.3)+
  theme_prism()+
  coord_cartesian(ylim=c(0,40))+
  scale_y_continuous(breaks = seq(0,40,5),expand = c(0,0))
p1 <- p+add_pvalue(df_p_val,label = "p.adj.signif")
p2 <- p+add_pvalue(df_p_val,label = "p.adj.signif",remove.bracket = T)
p1+p2
image.png

進階版

示例數(shù)據(jù)采用的是Prism8中XY的劑量反應(yīng)關(guān)系。

rm(list = ls())
p_load(tidyverse)
p_load(ggprism)
p_load(ggnewscale)

# 輸入數(shù)據(jù)準(zhǔn)備

df <- data.frame(
  agonist = c(1e-10, 1e-8, 3e-8, 1e-7, 3e-7, 1e-6, 3e-6, 1e-5, 3e-5, 1e-4, 3e-4),
  ctr1 = c(0, 11, 125, 190, 258, 322, 354, 348, NA, 412, NA),
  ctr2 = c(3, 33, 141, 218, 289, 353, 359, 298, NA, 378, NA),
  ctr3 = c(2, 25, 160, 196, 345, 328, 369, 372, NA, 399, NA),
  trt1 = c(3, NA, 11, 52, 80, 171, 289, 272, 359, 352, 389),
  trt2 = c(5, NA, 25, 55, 77, 195, 230, 333, 306, 320, 338), 
  trt3 = c(4, NA, 28, 61, 44, 246, 243, 310, 297, 365, NA)
) %>% 
  mutate(log.agonist = log10(agonist)) %>% 
  pivot_longer(
    c(-agonist, -log.agonist), 
    names_pattern = "(.{3})([0-9])", 
    names_to = c("treatment", "rep"),
    values_to = "response"
  ) %>% 
  filter(!is.na(response))
head(df)
## # A tibble: 6 x 5
##        agonist log.agonist treatment rep   response
##          <dbl>       <dbl> <chr>     <chr>    <dbl>
## 1 0.0000000001         -10 ctr       1            0
## 2 0.0000000001         -10 ctr       2            3
## 3 0.0000000001         -10 ctr       3            2
## 4 0.0000000001         -10 trt       1            3
## 5 0.0000000001         -10 trt       2            5
## 6 0.0000000001         -10 trt       3            4
p <- ggplot(df,aes(x=log.agonist, y=response))
dose_resp <- y ~ min + ((max - min) / (1 + exp(hill_coefficient * (ec50 - x))))
p <- p+geom_smooth(aes(color=treatment),
                   method = "nls",
                   formula = dose_resp,
                   se=F,
                   method.args=list(start=list(min=1.67,max=397,ec50=-7,hill_coefficient=1)))
p
image.png
# 改變曲線顏色

p <- p+scale_color_manual(
  labels = c("No inhibitor", "Inhibitor"),
  values = c("#00167B", "#9FA3FE")
)
p
image.png
# 調(diào)整線條顏色
p <- p+ggnewscale::new_scale_color()+
  geom_point(aes(color=treatment,shape=treatment),size=3)+
  scale_color_prism(
    palette = "winter_bright",
    labels=c("No inhibitor",
             "Inhibitor"))+
  scale_shape_prism(
    labels=c("No inhibitor",
             "Inhibitor"))
p
image.png
# 調(diào)整主題
p <- p+theme_prism(palette = "winter_bright",
                   base_size = 16)
p
image.png
# 調(diào)整y軸
p <- p+scale_y_continuous(
  limits=c(-100,500),
  breaks = seq(-100,500,100),
  guide = "prism_offset"
)
p
image.png
#調(diào)整x軸
p <- p + scale_x_continuous(
  limits = c(-10, -3), 
  breaks = -10:-3,
  guide = "prism_offset_minor",
  minor_breaks = log10(rep(1:9, 7)*(10^rep(-10:-4, each = 9))),
  labels = function(lab) {
    do.call(
      expression,
      lapply(paste(lab), function(x) bquote(bold("10"^.(x))))
    )
  }
)
p
image.png
# 調(diào)整x軸和y軸標(biāo)題昼弟,刪除legend
p <- p+theme(
  axis.title.y = element_blank(),
  axis.title.x = element_blank(),
  legend.position = c(0.05,0.95),
  legend.justification = c(0.05,0.95)
)+
  labs(x="[Agonist], M")
p
image.png

完整代碼(remember the order of layers is important)

dose_resp <- y ~ min + ((max - min) / (1 + exp(hill_coefficient * (ec50 - x))))

ggplot(df, aes(x = log.agonist, y = response)) + 
  geom_smooth(
    aes(colour = treatment),
    method = "nls", formula = dose_resp, se = FALSE,
    method.args = list(start = list(min = 1.67, max = 397, ec50 = -7, hill_coefficient = 1))
  ) + 
  scale_colour_manual(labels = c("No inhibitor", "Inhibitor"),
                      values = c("#00167B", "#9FA3FE")) + 
  ggnewscale::new_scale_colour() +
  geom_point(aes(colour = treatment, shape = treatment), size = 3) + 
  scale_colour_prism(palette = "winter_bright", 
                     labels = c("No inhibitor", "Inhibitor")) + 
  scale_shape_prism(labels = c("No inhibitor", "Inhibitor")) + 
  theme_prism(palette = "winter_bright", base_size = 16) + 
  scale_y_continuous(limits = c(-100, 500), 
                     breaks = seq(-100, 500, 100),
                     guide = "prism_offset") + 
  scale_x_continuous(
    limits = c(-10, -3), 
    breaks = -10:-3,
    guide = "prism_offset_minor",
    minor_breaks = log10(rep(1:9, 7)*(10^rep(-10:-4, each = 9))),
    labels = function(lab) {
      do.call(
        expression,
        lapply(paste(lab), function(x) bquote(bold("10"^.(x))))
      )
    }
  ) + 
  theme(axis.title.y = element_blank(),
        legend.title = element_blank(),
        legend.position = c(0.05, 0.95),
        legend.justification = c(0.05, 0.95)) + 
  labs(x = "[Agonist], M")

參考鏈接:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啤它,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舱痘,更是在濱河造成了極大的恐慌变骡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芭逝,死亡現(xiàn)場離奇詭異塌碌,居然都是意外死亡,警方通過查閱死者的電腦和手機旬盯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門台妆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胖翰,你說我怎么就攤上這事接剩。” “怎么了泡态?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵搂漠,是天一觀的道長。 經(jīng)常有香客問我某弦,道長桐汤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任靶壮,我火速辦了婚禮怔毛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腾降。我一直安慰自己拣度,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布螃壤。 她就那樣靜靜地躺著抗果,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奸晴。 梳的紋絲不亂的頭發(fā)上冤馏,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音寄啼,去河邊找鬼逮光。 笑死代箭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涕刚。 我是一名探鬼主播嗡综,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杜漠!你這毒婦竟也來了极景?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驾茴,失蹤者是張志新(化名)和其女友劉穎戴陡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沟涨,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年异吻,在試婚紗的時候發(fā)現(xiàn)自己被綠了裹赴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诀浪,死狀恐怖棋返,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雷猪,我是刑警寧澤睛竣,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站求摇,受9級特大地震影響射沟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜与境,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一验夯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摔刁,春花似錦挥转、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拗引,卻和暖如春借宵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寺擂。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工暇务, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泼掠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓垦细,卻偏偏與公主長得像择镇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子括改,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容