Plotting a bar plot where Y axis reflects percents, how can I "complete" each bar to 100%?
绘制一个Y轴反映平行度的条形图,我如何才能100%“完成”每个条形图?
Example
Consider the following plot:
请考虑以下曲线图:
library(ggplot2)
library(tibble)
my_df <- tribble(~step, ~prop,
"a", 1,
"b", 0.8,
"c", 0.55,
"d", 0.2
)
my_df |>
ggplot(aes(x = step,
y = prop)) +
geom_col()
Created on 2023-09-10 with reprex v2.0.2
创建于2023-09-10,Reprex v2.0.2
How can I create a plot that completes each bar to 100% out of it with dashed lines? Something like:
我如何创建一个用虚线100%地完成每个条形图的绘图?类似于:
更多回答
One option would be use a second geom_col
to first draw 100% bars, then place your bars on top of it where we have to explicitly set the outline color
. Note: One downside, which I did not realize at first, is that the outline of the background bars shouldn't but is visible. A fix would be to set the linewidth
and or the bar width as suggested by @jkd and @r2evans in their comments. A second and cleaner option would be to use a geom_path
(see below).
一种选择是使用第二个geom_ol首先绘制100%的条形图,然后将条形图放置在必须显式设置轮廓颜色的位置。注意:一开始我没有意识到的一个缺点是,背景栏的轮廓不应该但却是可见的。一个解决办法是按照@jkd和@r2evans在他们的评论中建议的那样设置行宽和/或条宽。第二个更简洁的选项是使用geom_path(如下所示)。
library(ggplot2)
library(tibble)
my_df <- tribble(
~step, ~prop,
"a", 1,
"b", 0.8,
"c", 0.55,
"d", 0.2
)
my_df |>
ggplot(aes(
x = step,
y = prop
)) +
geom_col(aes(y = 1), color = "red", linetype = "dashed", fill = NA) +
geom_col(color = "grey35")
IMHO, the cleanest option to achieve the same result would be to use a geom_path
which however requires some effort to create an appropriate dataset to draw the paths:
IMHO,要获得相同的结果,最干净的选择是使用geom_path,但这需要一些工作来创建适当的数据集来绘制路径:
library(ggplot2)
library(tibble)
library(dplyr, warn = FALSE)
make_path <- function(y, width = .9) {
if (y < 1) {
data.frame(
x = width / 2 * c(-1, -1, 1, 1),
y = c(y, 1, 1, y)
)
} else {
data.frame(x = numeric(0), y = numeric(0))
}
}
df_path <- my_df |>
mutate(step = factor(step)) |>
reframe(make_path(prop), .by = step) |>
mutate(x = as.numeric(step) + x)
my_df |>
ggplot(aes(
x = step,
y = prop
)) +
geom_col(color = "grey35") +
geom_path(
data = df_path,
aes(x = x, y = y, group = step),
color = "red", linetype = "dashed"
)
Yet another way with stacked bars and controlling alpha
and manual
scaling of properties:
另一种方法是堆叠条形图并控制Alpha和手动缩放属性:
library(ggplot2)
library(tibble)
my_df <- tribble(~step, ~prop,
"a", 1,
"b", 0.8,
"c", 0.55,
"d", 0.2
)
my_df$type <- 'filled'
my_df2 <- my_df
my_df2$prop <- 1 - my_df2$prop
my_df2$type <- 'empty'
my_df <- rbind(my_df, my_df2)
my_df |> ggplot(aes(x = step, y = prop)) +
geom_col(aes(alpha=type, col=type, linetype=type)) +
scale_linetype_manual(values=c('dashed','solid')) +
scale_color_manual(values=c('red', 'gray')) +
scale_alpha_manual(values=c(0, 1)) + theme(legend.position = "none")
In base R we can use rect
.
在基数R中,我们可以使用RECT。
plot(d$prop, xlim=c(.5, 4.5), ylim=0:1, type='n', xaxt='n', ylab='Proportion', xlab='Step')
axis(1, axTicks(1), labels=d$step)
sq <- seq_len(nrow(d))
rect(sq - .3, 0, sq + .3, rep(1, nrow(d)), lty=2, border=2)
rect(sq - .3, 0, sq + .3, d$prop, col=8, border=8, lwd=2)
Data:
数据:
d <- structure(list(step = c("a", "b", "c", "d"), prop = c(1, 0.8,
0.55, 0.2)), class = "data.frame", row.names = c(NA, -4L))
更多回答
Thanks! This solution is nice and quick. However, it wraps the entire rectangle with the dashed line, so with different colors (other than grey) it's noticeable and becomes confusing.
谢谢!这个解决方案又好又快。然而,它用虚线包围了整个矩形,所以用不同的颜色(不是灰色)会很明显,也会让人感到困惑。
In addition to explicitly setting the color you could also slightly increase the grey bar's linewidth.
除了明确设置颜色外,您还可以略微增加灰色条的线宽。
Option 1, as jkd suggested: set the line width, geom_col(color = "grey35", linewidth=2)
. Option 2 (new), reduce the width of the red bars a little. They start at 90% of the data resolution (which is 1
here, so 0.9
is default width), we can do: geom_col(aes(y = 1), color = "red", linetype = "dashed", fill = NA, width = 0.89)
.
选项1,如jkd所建议的:设置行宽geom_ol(color=“grey35”,linewidth=2)。选项2(新),将红色线条的宽度略微缩小。它们以数据分辨率的90%开始(这里是1,所以0.9是默认宽度),我们可以这样做:geom_ol(aes(y=1),color=“red”,linetype=“dash”,ill=na,idth=0.89)。
Thanks @jkd and @r2evans for your comments which both offer valid fixes. Just added a second option using a geom_path
which extends the bars and avoids the issue with the outline.
感谢@jkd和@r2evans的评论,它们都提供了有效的修复。我刚刚使用geom_path添加了第二个选项,该选项扩展了条形图并避免了轮廓问题。
我是一名优秀的程序员,十分优秀!