有时候我们会用帕累托图(Pareto chart)来展现数据的两个指标(一个频数,一个率),这种情况就需要用双坐标来展示。ggplot2的作者Hardley似乎也不太认同双坐标的存在。那么,有时候回归基础包,也是另一种尝试。花了点时间用基础包画了下面这张帕类托图,左侧纵坐标代表病人例数,右侧表示死亡率,横坐标是一种疾病严重程度评分。那么我们来看一下这么一张图是怎么一步步画出来的吧。


image.png

首先是读入数据

df

需要示例数据的可以直接在文末留言

查看数据头部前6行

head(df)


image.png

查看数据尾部的6行

tail(df)


image.png

做帕累托图需要准备的数据格式是两列 :第一列是SOFA评分,在医学领域,SOFA评分越高,表示疾病约严重。第二列是病人的生存情况,0代表存活,1代表死亡。

接下来对对数据做一个简单的统计

统计一下每个评分对应的生存和死亡人数

count_sofa 
count_sofa

image.png
再统计一下生存率和死亡率
round (addmargins (prop.table( table(df$status, df$sofa), 2), 1)*100, 2)

image.png
这行代码稍微有点长,用到了四个函数
table()
prop.table()
addmargins()
round()
把这四个函数从里到外一次运行应该就可以知道每个函数起到什么作用了。
接下来将评分和死亡率整合在一个新的数据集里
sofa_score
mortality_rate 
prop.table (
table (df$status, df$sofa), 2), 1)*100, 2) [2, ])
sofa_data
sofa_data

image.png
首先是画柱形图
barplot (count_sofa, xlim = c(0, 24), xlab = "SOFA Score",
ylab = "Numbers of Patients")

image.png
默认黑白配色,我们可以改一下颜色。注意,这里的颜色设定参数col,等同于ggplot2里的fill。
barplot (count_sofa, xlim=c (0, 24), xlab = "SOFA Score",
col = c ("#66C2A5", "#FC8D62"),
ylab = "Numbers of Patients")

image.png
柱形图上添加折线图
bar
col = c ("#66C2A5", "#FC8D62"),
ylab = "Numbers of Patients")
par(new=T)
plot (bar, sofa_data$mortality_rate,
axes=F, xlim=c(0, 24),
ylim=c(0, 100),
xlab="", ylab="",
col="black", lwd=2,
type="b")

image.png
初具雏形,添加右侧纵坐标和坐标文字
bar
col = c ("#66C2A5", "#FC8D62"),
ylab = "Numbers of Patients")
par(new=T)
plot (bar, sofa_data$mortality_rate,
axes=F, xlim=c(0, 24),
ylim=c(0, 100),
xlab="", ylab="",
col="black", lwd=2,
type="b")
axis (4, col="black", col.ticks="black", col.axis="black")
mtext ("Mortality (%)", side=4, line=3, col="black")


image.png

但是这里遇到一个问题是添加右侧坐标轴的标题没有显示出来,因为超出了绘图边界。所以要对默认的绘图边界进行修改

par (mar = c (5, 5, 4, 5))
bar
col = c ("#66C2A5", "#FC8D62"),
ylab = "Numbers of Patients")
par(new=T)
plot (bar, sofa_data$mortality_rate,
axes=F, xlim=c(0, 24),
ylim=c(0, 100),
xlab="", ylab="",
col="black", lwd=2,
type="b")
axis (4, col="black", col.ticks="black", col.axis="black")
mtext ("Mortality (%)", side=4, line=3, col="black")


image.png

因为在默认条件下,对于图形周边间隙的设定为5, 4, 4, 2(底边,左边,顶边,右边),我们需要对页面布局重新进行设定,以防右侧坐标文字无法显示。 用到的是 par (mar = c (5, 5, 4, 5))

最后是添加添加图例。locator (1)这个参数可以交互式地放置图例。运行这句后,光标显示十字,鼠标点下的位置,即为图例最后出现的位置。

par (mar = c (5, 5, 4, 5))
bar
col = c ("#66C2A5", "#FC8D62"),
ylab = "Numbers of Patients")
par(new=T)
plot (bar, sofa_data$mortality_rate,
axes=F, xlim=c(0, 24),
ylim=c(0, 100),
xlab="", ylab="",
col="black", lwd=2,
type="b")
axis (4, col="black", col.ticks="black", col.axis="black")
mtext ("Mortality (%)", side=4, line=3, col="black")
legend (locator (1),
legend=c ("Survivor", "Non-survivor", "Mortality"),
pch = c (15, 15, 1),
col=c ("#66C2A5", "#FC8D62", "black"))