【问题标题】:Having issues with bar chart x axis labels overlapping and spacing条形图 x 轴标签重叠和间距问题
【发布时间】:2021-09-04 16:24:12
【问题描述】:

我需要绘制 x 轴(日期)和 y 轴(销售量)的图表,并表示日历年中的每一天。

问题 - 首先是日期之间的空白。我尝试使用因子(日期),但是当我想要对图表进行其他更改时遇到了问题。另一个问题是 x 轴目前是按月计算的。这看起来不错。但是,当我尝试在白天这样做时,我得到...

简而言之,它看起来像一团糟。可能是因为我试图一次输入每个日期。以下是我的代码。

ggplot(MyDataCSV, aes(x = Date, y = Volume)) +
  geom_col(stat = "identity",
           width = 0.9, 
           fill = "coral",
           alpha = 0.5,
           colour = "black",
           position = "dodge") +
  scale_x_date(date_breaks = "1 day", labels = date_format("%m/%d")) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  ggtitle("Volume Sold by Date") +
  theme(plot.title = element_text(hjust = 0.5))

我是 R 的初学者,所以我知道这是初学者级别,但我很困惑。我安装了 ggplot、tidyverse、dplyr、lubridate 和 scales。本质上,我希望我在 x 轴上的标签看起来像第一张图片,除了我的数据集中的每个日期(大约一年)

【问题讨论】:

  • 我不明白。如果您标记每个日期,您将永远无法阅读它们。你有太多的日期来使它清晰。你想要一个小的 2pt 字体还是什么的?当你有这么多价值观时,通常你只标记几个,让人们通过肉眼判断其他价值观在哪里。
  • 你知道如何将它分割成多个图像吗?我愿意每 2-3 个月或其他时间使用一个新图表进行分区。这正是我被要求做的。所以这就是我需要帮助的原因。但我意识到清晰的问题

标签: r ggplot2 data-visualization


【解决方案1】:

一种解决方案是指定保存图形的尺寸,例如

# Load libraries
library(tidyverse)
library(lubridate)

# Generate a fake dataset (minimal reproducible example)
df <- data.frame(Date = seq.Date(from = ymd("2021-01-01"),
                                 to = ymd("2021-12-31"),
                                 by = "1 day"),
                 Volume = runif(365, 0, 4e+08))

# Plot the fake data
ggplot(df, aes(x = Date, y = Volume)) +
  geom_col(stat = "identity",
           width = 0.9, 
           fill = "coral",
           alpha = 0.5,
           colour = "black",
           position = "dodge") +
  scale_x_date(date_breaks = "1 day", labels = scales::date_format("%m/%d")) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  ggtitle("Volume Sold by Date") +
  theme(plot.title = element_text(hjust = 0.5))

# Save the plot
ggsave(filename = "example_1.png", width = 60, height = 10, limitsize = FALSE)

然后,如果你放大,你可以看到日期不重叠:

否则,您可以将 date_breaks 更改为“1 个月”或“1 周”以停止日期重叠,同时保持“正常”数字大小:

# Plot the fake data
ggplot(df, aes(x = Date, y = Volume)) +
  geom_col(stat = "identity",
           width = 0.9, 
           fill = "coral",
           alpha = 0.5,
           colour = "black",
           position = "dodge") +
  scale_x_date(date_breaks = "1 week", labels = scales::date_format("%m/%d")) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  ggtitle("Volume Sold by Date") +
  theme(plot.title = element_text(hjust = 0.5))

或者,我可能会推荐的选项,您可以通过例如创建构面。每 3 个月:

# Load libraries
library(tidyverse)
library(lubridate)

# Generate a fake dataset (minimal reproducible example)
df <- data.frame(Date = seq.Date(from = ymd("2021-01-01"),
                                 to = ymd("2021-12-31"),
                                 by = "1 day"),
                 Volume = runif(365, 0, 4e+08))

plot_labels <- c(
  "1" = "First Quarter, 2021",
  "2" = "Second Quarter, 2021",
  "3" = "Third Quarter, 2021",
  "4" = "Fourth Quarter, 2021"
)
# Plot the fake data
df %>%
  mutate(quarter = cut.Date(Date, breaks = "quarter", labels = FALSE)) %>%
  ggplot(., aes(x = Date, y = Volume)) +
  geom_col(stat = "identity",
           width = 0.9, 
           fill = "coral",
           alpha = 0.5,
           colour = "black",
           position = "dodge") +
  scale_x_date(date_breaks = "1 day", labels = scales::date_format("%m/%d")) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  ggtitle("Volume Sold by Date") +
  theme(plot.title = element_text(hjust = 0.5)) +
  facet_wrap(~ quarter, ncol = 1, scales = "free_x",
             labeller = labeller(quarter = plot_labels))

【讨论】:

  • 谢谢你。出于好奇,有没有其他方法可以使日期标签适合而不涉及保存时的调整?像,有没有办法改变图像的宽度?另外,我们可以对空间做些什么,比如使用因子?
  • 当你说“有没有办法改变图像的宽度?”,你的意思是在 R/RStudio 查看器窗口中吗?您可以在 RStudio 中单击并拖动窗口以使其变大;你说的是这个吗?
  • 嗯,我的意思是,当我使用您的保存和大小规格导出图像时,它起作用了。没有它,即使我放大,我也会变得一团糟。我主要想知道我们是否可以让它以正确的大小将其吐出,而不必在最后明确保存文件。
  • 答案是“是的,你可以”,但它更复杂。您需要使用theme() 调整绘图的每个组件的大小。如果您能够发布您的实际数据,这将更容易评估它是否是一个可行的解决方案(例如,编辑您的帖子以包含来自dput(MyDataCSV) 的输出)
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2018-01-10
  • 2021-02-18
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多