python和R绘制箱线图+抖动点

python和R绘制箱线图+抖动点

散点箱线图

python和R绘制箱线图+抖动点_第1张图片

IPCC AR6 https://www.ipcc.ch/
通过散点展示数据的直观分布
x轴刻度标签如果是“连续”数据,可添加渐变背景。通过渐变来体现升温幅度,美观形象。

python版本:

先手搓数据:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="darkgrid")
# Dataset:
a = pd.DataFrame({ 'group' : np.repeat('A',50), 'value': np.random.normal(10, 5, 50) })
b = pd.DataFrame({ 'group' : np.repeat('B',50), 'value': np.random.normal(13, 1.2, 50) })
c = pd.DataFrame({ 'group' : np.repeat('B',50), 'value': np.random.normal(18, 1.2, 50) })
d = pd.DataFrame({ 'group' : np.repeat('C',20), 'value': np.random.normal(25, 4, 20) })
e = pd.DataFrame({ 'group' : np.repeat('D',10), 'value': np.random.uniform(12, size=10) })
df = pd.concat([a, b, c, d, e])

然后通过boxplot绘制箱线图,通过stripplot绘制抖动点,通过pointplot绘制平均值点。
PS:pointplot并不是画“点”的函数,而是

df = sns.load_dataset("penguins")
sns.pointplot(data=df, x="sex", y="bill_depth_mm", hue="island", dodge=True)

python和R绘制箱线图+抖动点_第2张图片
但是我们不要上下的误差线,也不用连接线:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="darkgrid")
# Dataset:
a = pd.DataFrame({ 'group' : np.repeat('A',50), 'value': np.random.normal(10, 5, 50) })
b = pd.DataFrame({ 'group' : np.repeat('B',50), 'value': np.random.normal(13, 1.2, 50) })
c = pd.DataFrame({ 'group' : np.repeat('B',50), 'value': np.random.normal(18, 1.2, 50) })
d = pd.DataFrame({ 'group' : np.repeat('C',20), 'value': np.random.normal(25, 4, 20) })
e = pd.DataFrame({ 'group' : np.repeat('D',10), 'value': np.random.uniform(12, size=10) })
df = pd.concat([a, b, c, d, e])

# Initialize the figure
f, ax = plt.subplots()
#sns.despine(bottom=True, left=True)

# Show each observation with a scatterplot
ax = sns.boxplot(x='group', y='value', data=df, color='white')#, showcaps=False)
ax = sns.stripplot(
    data=df, x="group", y="value", hue="group",
     alpha=.25, zorder=1, legend=False, jitter=0.2
)
ax = sns.pointplot(
    data=df, x="group", y="value", hue="group",
    join=False,  palette="dark", estimator='mean',
    markers="d", scale=.75, errorbar=None
)
sns.legend = None

#ax = sns.stripplot(x='group', y='value', data=df, color="orange", jitter=0.2, size=2.5)
plt.show()

python和R绘制箱线图+抖动点_第3张图片

R语言版本

# edit by WangLonghao [email protected]
# 2022.11.15
# generate data
library(tidyverse)

names <- c(rep("A", 40) , rep("B", 25) , rep("C", 35), rep("D", 30))
value <- c( rnorm(40 , mean=10 , sd=9) , rnorm(25 , mean=2 , sd=15) , rnorm(35 , mean=0 , sd=10) , rnorm(30 , mean=-10 , sd=12))
dplot <- data.frame(names,value)
lower <- dplot$value %>% tapply(names, function(x){
  return(quantile(x, c(0.25)))
})
upper <- dplot$value %>% tapply(names, function(x){
  return(quantile(x, c(0.75)))
})
median <- dplot$value %>% tapply(names, median)

dplot <- data.frame(names,value,
                    lower=c(rep(lower[1], 40), rep(lower[2], 25), rep(lower[3], 35), rep(lower[4], 30)),
                    upper=c(rep(upper[1], 40), rep(upper[2], 25), rep(upper[3], 35),rep(upper[4], 30)), 
                    median=c(rep(median[1], 40), rep(median[2], 25), rep(median[3], 35), rep(median[4], 30)))

# Plot boxplot1
dplot <- data.frame(names,value,lower=c(rep(lower[1], 40), rep(lower[2], 25), rep(lower[3], 35), rep(lower[4], 30)),
                    upper=c(rep(upper[1], 40), rep(upper[2], 25), rep(upper[3], 35),rep(upper[4], 30)), median=c(rep(median[1], 40), rep(median[2], 25), rep(median[3], 35), rep(median[4], 30)))

dplot %>% 
  ggplot(aes(x=names,y=value))+
  geom_boxplot(color="black", fill="black", alpha=0.2, width=0.3, outlier.shape = NA, coef = 0) +
  geom_jitter(color="black", size=1, alpha=0.9, width=0.2)+
  theme_classic()

晶须影响,我们也去掉了,只需要在代码中稍作修改

python和R绘制箱线图+抖动点_第4张图片

接下来将图片导出到PPT,导出eps格式的图像,拖入ppt,右键“转换为形状”,再次右键“组合”——“取消组合”,这样就可以对图片的各个部件进行修改。

接下来绘制一个长方形,置于图片底层,右键设置格式。填充与线条-渐变光圈,按下图设置:

python和R绘制箱线图+抖动点_第5张图片

最后调整文字大小、截断坐标轴、添加圆圈形状来突出重点区域,复现结果如图:

python和R绘制箱线图+抖动点_第6张图片

你可能感兴趣的:(R语言,python,python,r语言)