开发者社区 问答 正文

ggplot2 dotplot如何创建空的x轴类别

我在制作的CSV文件中有一些数据,以便创建不同分布的点图。

这些是虚构数据:

structure(list(uniform = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 
4, 4, 4, 4, 5, 5, 5, 5), left_skew = c(1L, 2L, 2L, 3L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), right_skew = c(5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 
2L, 2L, 1L), trunc_uni_left = c(3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), trunc_uni_right = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L), trunc_norm_left = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L), trunc_norm_right = c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L), bimodal = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), extreme_left = c(3L, 
3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L), extreme_right = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L)), row.names = c(NA, 
-20L), class = "data.frame")

当x轴上的五个类别中的每个类别都有“观察”时,点状图将起作用。但是,如果缺少值,则仅反映这些类别。例如,在一个图中没有1和2,因此该图仅显示类别3、4和5。

我尝试使用scale_x_discrete设置限制和中断,但这不起作用。

这是我用来绘制数据的代码:

ggplot(df, aes(x = trunc_uni_left))+
  geom_point()+ 
  geom_dotplot(method = "histodot", binwidth = 0.25, fill = 'red', dotsize = 0.75)+
  labs(x = 'Rating Categories', y = 'Rating Frequency')+
  theme_bw()+
  ylim(0 , 20)+
  scale_x_discrete(breaks = c ("0.5", "1", "1.5", "2", "2.5"),
                   labels = c ("1", "2", '3', '4', '5'),
                   limits = c ("1", "2", "3", "4", "5"))+
  theme(panel.grid = element_blank(),
        text = element_text(size = 16),
        axis.text.x = element_text(size =  16),
        axis.title.x = element_text(size = 16, margin = margin(t = 20)),
        axis.title.y = element_text(size = 16, margin = margin(r = 20)),
        legend.title= element_text(size = 16))

我可以在ggplot中做些什么来实现这一目标吗?或者,是否可以在R中创建一个数据框以使我做到这一点?

我不是世界上最好的编码器,因为您可能会说出来,非常感谢您的帮助。

谢谢!

展开
收起
几许相思几点泪 2019-12-03 15:34:29 542 分享 版权
阿里云 AI 助理回答

在你的问题中,你希望在ggplot2的点图中强制显示所有定义好的类别,即使某些类别的数据在你的数据集中不存在。要实现这个目标,你可以通过创建一个完整分类列表并将其与你的数据集进行合并来完成。这样可以确保所有类别的x轴标签都会显示出来,即使它们没有对应的观测值。

下面是一个步骤说明和示例代码:

  1. 创建全分类列表:首先,你需要确定所有可能的类别(在这个例子中是1到5)。然后,使用这些类别创建一个完整的数据框,其中包含每个类别的每个可能的“观察”。

  2. 合并数据:将这个全分类列表的数据框与你的原始数据集按行合并。对于缺失的观察值,你可以选择填充为NA或其他合适的默认值。

  3. 绘制图形:最后,使用合并后的数据框绘制点图。由于现在每个类别都有至少一行数据(哪怕是NA),scale_x_discrete应该能正确显示所有的类别了。

下面是具体的R代码示例:

# 假设df是你的原始数据框

# 创建全分类列表
full_categories <- data.frame(trunc_uni_left = 1:5)

# 合并数据,这里假设其他列(如y轴对应的频率)在缺失时应为0
df_full <- merge(full_categories, df, by = "trunc_uni_left", all.x = TRUE)
df_full[is.na(df_full)] <- 0  # 或者根据需要替换为其他默认值

# 使用合并后的数据框绘制图形
library(ggplot2)

ggplot(df_full, aes(x = trunc_uni_left, y = ...)) {  # 注意这里的'...'应替换为你实际使用的y轴变量
  geom_point()  
  geom_dotplot(method = "histodot", binwidth = 0.25, fill = 'red', dotsize = 0.75) 
  labs(x = 'Rating Categories', y = 'Rating Frequency') 
  theme_bw() 
  ylim(0 , 20) 
  scale_x_discrete(limits = c("1", "2", "3", "4", "5"))  # 不再需要breaks和labels,因为limits已经足够
  theme(
    panel.grid = element_blank(),
    text = element_text(size = 16),
    axis.text.x = element_text(size = 16),
    axis.title.x = element_text(size = 16, margin = margin(t = 20)),
    axis.title.y = element_text(size = 16, margin = margin(r = 20)),
    legend.title= element_text(size = 16)
  )
}

这段代码首先创建了一个包含所有期望类别的数据框,然后将其与原始数据框合并,并用0填充缺失值。之后,使用这个新数据框绘图,你应该能看到x轴上完整地展示了1到5的所有类别。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: