条形图及其外观 - 我应该添加标题,值应该去哪里等

机器算法验证 r 数据可视化 ggplot2
2022-04-02 15:50:18

我没有使用r,但我最近决定使用它来绘制图表,因为它具有强大的功能。'想要绘制一个图表来显示选举中的选民投票率。我对正确的(即关于他们的外观正确)图表知之甚少,所以我在互联网上找到了一个看起来(对我来说)很好的图表。这是这个图表:

在此处输入图像描述

这是我的图表。您可以看到它远非好(屏幕截图来自 R-Fiddle,我认为从桌面 R 编译时该图可能看起来不同)。

在此处输入图像描述

我应该怎么做才能使它更好(例如可读)?具体来说,我需要 x 和 y 轴的标题吗?如果值在条形顶部(如在我的图表中)或在条形图内(在 Internet 中找到的图表),看起来会更好吗?

我的代码是:

# Load packages
library(ggplot2)
library(scales)
# Create dataset
dat <- data.frame(years = c("1991", "1993", "1997", "2001", "2005", "2007", "2011", "2015"),
freq = c(43.20, 52.13, 47.93, 46.29, 40.57, 53.88, 48.92, 50.92))
# Create graph bar
ggplot(dat, aes(years, freq)) +   geom_bar(stat = "identity", width=0.55)
+ geom_text(aes(label=comma(freq), y=freq+1.1))  
+ scale_y_continuous(breaks = seq(0,50,10)) +  theme_classic()

编辑:

我试图在评论和答案中加入尽可能多的建议。我想出了以下几点:

在此处输入图像描述

你怎么看呢?

3个回答

也许“ Tufte`rize ”你的情节:

ggplot(dat, aes(years, freq)) + 
  geom_bar(stat = "identity", width=0.55, fill="grey")+ 
  scale_y_continuous(breaks = seq(0,50,10)) + 
  geom_hline(yintercept= seq(0,50,10), col="white") + 
  theme_classic(base_size = 16) + theme(axis.ticks=element_blank()) + 
  labs(x=NULL, y=NULL) +
  ggtitle("freq per year")

或者

ggplot(dat, aes(years, freq)) + 
  geom_bar(stat = "identity", width=0.55, fill="grey64")+ 
  scale_y_continuous(breaks = seq(0,65,10)) + 
  theme_classic(base_size = 18) + 
  theme(axis.text.y=element_blank(), axis.ticks=element_blank(), axis.line.y=element_blank()) + 
  labs(x=NULL, y=NULL) + 
  geom_text(aes(label=format(freq,decimal.mark = ",")), vjust=-.3, size = 4)

在此处输入图像描述

这不是条形图的一个很好的应用。即使在另一个答案中推荐了所谓的“Tufte`rized”条形图,Tufte 也会不高兴。条形图只是用太多的墨水来传达信息。查看Tufte 的网站和书籍,如果可能的话,参加他关于如何有效显示数据的研讨会。

显示这些数据只需要一张投票率与年份的线图。沿 x 轴的实际年份间距相等的线图也将消除条形图中包含的观测值在时间上等间距的暗示。

这是一个强调观察值范围内变化的示例:

在此处输入图像描述

我发现点之间的连接线有助于跟踪时间关系,即使只有 8 个不等间距的观察。尼克考克斯在评论中正确地指出,这可能倾向于暗示日期之间的线性变化。这些线条是灰色的,在观察中带有黑点,以试图淡化这种建议。

如果您对 0% 投票率基线的变化更感兴趣,您可以相应地调整 y 轴限制。但是,您是否曾经有过任何接近 0% 的选举投票率?此外,数字也不是显示精确到小数点后 2 位的结果的好地方。为此,请使用一张桌子。

代码全部来自 R 基础图形。您可能可以做一些更优雅的事情,ggplot但我对此几乎没有经验。首先,将您的“年”从文本更改为数字:

dat$years <- as.numeric(as.character(dat$years))

然后对于情节:

plot (freq~years,data=dat,xlim=c(1990,2016),xlab="Year",ylab="Percentage Turnout",type="l",axes=FALSE,col="gray")
points (freq~years,data=dat,pch=19)
axis(1,at=seq(1990,2020,10))
axis(2,at=seq(42,54,6))

标准 R 图形在绘制灰线axes=FALSE的命令中在整个绘图周围放置了一个可能会分散注意力的框,规范在此处省略了该框。plot然后该points命令放置点。单独的规范axis允许控制刻度线的放置和标记位置;R 可能倾向于过度标记某些人的口味。

我同意 EdM 的观点,即“条形图对于所传达的信息而言墨水过多。” 这是他的答案的 ggplot2 版本:

library(ggplot2)

df <- data.frame(years=c(1991, 1993, 1997, 2001, 2005, 2007, 2011, 2015),
                 freq=c(43.20, 52.13, 47.93, 46.29, 40.57, 53.88, 48.92, 50.92))

p <- (ggplot(df, aes(x=years, y=freq)) +
      geom_line(size=1.25, color="#999999") + geom_point(size=3.5, color="black") +
      theme_bw() +
      theme(panel.border=element_blank(), panel.grid.minor=element_blank(),
            axis.title.y=element_text(vjust=1.25)) +
      scale_x_continuous("", breaks=seq(1990, 2015, 5), minor_breaks=NULL) +
      scale_y_continuous("percentage turnout", limits=c(36, 59),
                         breaks=seq(40, 55, 5), minor_breaks=NULL))
p
ggsave("percentage_turnout_over_time.png", p, width=10, height=8)

产生这个:

ggplot2图

编辑:这是一个带有数字的版本:

p <- (ggplot(df, aes(x=years, y=freq, label=freq)) +
      geom_line(size=1.25, color="#999999") + geom_point(size=3.5, color="black") +
      geom_text(vjust=c(2, -1, -1.5*sign(diff(diff(df$freq))) + 0.5)) +
      theme_bw() +
      theme(panel.border=element_blank(), panel.grid.minor=element_blank(),
            axis.title.y=element_text(vjust=1.25)) +
      scale_x_continuous("", breaks=seq(1990, 2015, 5), minor_breaks=NULL) +
      scale_y_continuous("percentage turnout", limits=c(36, 59),
                         breaks=seq(40, 55, 5), minor_breaks=NULL))
p
ggsave("percentage_turnout_over_time_with_text.png", p, width=10, height=8)

ggplot2 图形第二版

尼克考克斯在原帖下的评论令人信服:

我也认为显示数字没有什么害处。人们经常想要从图表中读取数字,就像他们(应该)想要从表格中读取数字一样。此外,在论文中提供图表 PLUS 表格通常会被审稿人拒绝,因为太多的空间用于相同的信息,因此混合图表和表格是完全可以辩护的。