下面的代码使用R中的基本绘图函数创建一个pareto图表。如何使用ggplot创建相同的图表?
* 我知道有些人会讨厌两个y轴的情节。请不要在这篇文章中包含这个辩论。感谢
## Creating the d tribble
library(tidyverse)
d <- tribble(
~ category, ~defect,
"price", 80,
"schedule", 27,
"supplier", 66,
"contact", 94,
"item", 33
)
## Creating new columns
d <- arrange(d, desc(defect)) %>%
mutate(
cumsum = cumsum(defect),
freq = round(defect / sum(defect), 3),
cum_freq = cumsum(freq)
)
## Saving Parameters
def_par <- par()
## New margins
par(mar=c(5,5,4,5))
## bar plot, pc will hold x values for bars
pc = barplot(d$defect,
width = 1, space = 0.2, border = NA, axes = F,
ylim = c(0, 1.05 * max(d$cumsum, na.rm = T)),
ylab = "Cummulative Counts" , cex.names = 0.7,
names.arg = d$category,
main = "Pareto Chart (version 1)")
## Cumulative counts line
lines(pc, d$cumsum, type = "b", cex = 0.7, pch = 19, col="cyan4")
## Framing plot
box(col = "grey62")
## adding axes
axis(side = 2, at = c(0, d$cumsum), las = 1, col.axis = "grey62", col = "grey62", cex.axis = 0.8)
axis(side = 4, at = c(0, d$cumsum), labels = paste(c(0, round(d$cum_freq * 100)) ,"%",sep=""),
las = 1, col.axis = "cyan4", col = "cyan4", cex.axis = 0.8)
## restoring default paramenter
par(def_par)
答案 0 :(得分:10)
这是一个开始。我将您的return d["marker-color"];
函数合并到一个流中,以避免分配和重新分配变量dplyr
。我添加了d
次调用,使mutate
成为一个因子,根据category
的相应值排序,使用defect
中的fct_reorder
(forcats
附带tidyverse
})。
我不确定的是如何让左侧y轴断裂。我通过获取d$cumsum
的唯一值来手动设置它们,但可能有一种方法可以在breaks
的{{1}}参数内为其编写函数。
scale_y_continuous
的更新版本允许辅助轴,但它需要基于主轴的转换。在这种情况下,这意味着它应该采用主轴的值并除以最大值以获得百分比。
正如@ClausWilke在评论中指出的那样,为确保辅助轴与数据正确对齐,使得顶点为100%,请在设置辅助轴时使用ggplot2
。
~. / max(d$cumsum)
由reprex package(v0.2.0)创建于2018-05-12。