【问题标题】:Reformatting bar graph in R在 R 中重新格式化条形图
【发布时间】:2021-05-13 09:20:40
【问题描述】:

对于一项任务,我需要可视化公司的市场价值,这些公司分成不同的组来表示行业。我已经创建了以下图表:Market Value of Equity graph,但这些图表在学术文章中不允许使用这种颜色。使用代码如下:

ggplot(data = g, aes(x=g$MarketCap, group = g$SIC, fill=SIC)) +
  geom_histogram(position = "dodge", binwidth = 1000) + theme_bw() + xlim(0,5000) +
  labs(x = "Market Value (in Millions $)", title = "Market Value per Industry")

我试图找到另一种显示方式,但我什么也没找到。另一种方法是将所有条形的颜色更改为灰色,但随后它们变得无法区分。有谁知道如何解决这个问题?非常感谢提前..

【问题讨论】:

  • Patudb,如果美观,您可以使用许多(其他)调色板之一或直接分配颜色 - 我同意默认的 ggplot 颜色很糟糕。或者,您可以使用构面为不同行业(或您为构面选择的相应分组变量)创建多个条形图。
  • 为了提供@Ray 解决方案的具体示例,将theme_bw() 替换为scale_fill_grey() 将为您提供您想要的。 theme_xxx 影响情节的“家具”,而不是数据显示。
  • 有一个包ggpattern,见this answer。或here.
  • 我确实可以改变颜色,但恐怕这看起来太乱了。或者,我尝试创建一个包含每个行业平均市值的数据表,但这不起作用。我尝试了以下代码,但它给出了所有行业的市值平均值:MarketCapIndustry <- g %>% group_by(g$SIC) %>% summarise(MeanMarketCap = mean(g$MarketCap))。这导致每个行业的平均市值都相等,这显然是不正确的。有人知道如何解决这个问题吗?因为这让我猜想绘图更容易?

标签: r ggplot2 data-visualization bar-chart


【解决方案1】:

Patubd,发生了很多事情,我担心 cmets 不足以让你继续前进。因此,我在这里尝试指出一些事情。

您没有提供可重现的示例。因此,我预先“模拟”了一些数据。您可以根据自己的喜好进行调整。

在您的ggplot() 调用中,您指的是g 数据框。然后就不需要使用显式的g$variable 表示法了。

您在 MeanMarketCap 管道中执行相同操作。我想这是你面临的问题的一部分。

数据:

library(dplyr)
set.seed(666)   # set seed for random generator
# ------------------- data frame with 60 examples of industry group SIC and MarketCap
df <- data.frame(
   SIC        = rep(c("0","1","2"), 20)
  , MarketCap = c(rep(50, 30), rep(1000, 15), rep(2000, 10), rep(3000, 5))
)
# ------------------- add 15 random picks to make it less homogenuous
df <- df %>% 
   bind_rows(df %>% sample_n(15))

(I) “色彩较少”和/或方面

fig1 <- ggplot(data = df, aes(x=MarketCap, group = SIC, fill=SIC)) +
    geom_histogram(position = "dodge") + 
#------------- as proposed to make graph less colourful / shades of grey ---------
    scale_fill_grey() + 
#---------------------------------------------------------------------------------
    theme_bw() + xlim(0,5000) +
    labs(x = "Market Value (in Millions $)", title = "Market Value per Industry")


# make a 2nd plot by facetting above
# If the plot is stored in an object, i.e. fig1, you do not have to "repeat" the code
# and just add the facet-layer
fig2 <- fig1 + facet_grid(. ~ SIC)

library(patchwork)   # cool package to combine plots
fig1 / fig2          # puts one plot above the other

您可以通过一个方面来划分组。这支持并排分析......并且组的着色不那么重要,因为这现在是刻面的一部分。但是您可以将两者结合起来,如图所示。

(二)总结意思

如果您不使用df$variable 表示法,您的代码将起作用。这会破坏 group-by 调用,您可以参考完整的数据框。

df %>% 
   group_by(SIC) %>% 
   summarise(MeanMarketCap = mean(MarketCap))

这产生了 - 简单的模拟 - 数据:

# A tibble: 3 x 2
  SIC   MeanMarketCap
  <chr>         <dbl>
1 0              858.
2 1              876.
3 2              858.

要显示分布,可以使用箱线图。箱线图适用于四分位数间距(第 25-75 个百分位数和中位数 [第 50 个百分位数]。
您可以为此使用geom_boxplot()ggplot 将负责统计计算。

df %>%
   ggplot() +
   geom_boxplot(aes(x = SIC, y = MarketCap)

使用您的数据(更多不同的数据点),该图看起来会更令人印象深刻。 但是您已经可以清楚地看到示例行业 SIC 中中位数的差异。

如果您觉得可以使用geom_jitter() 添加数据点。

希望这能让你开始。祝你好运!

【讨论】:

  • 很棒的解释!这真的让我开始了,非常感谢!!
  • 太棒了。我很高兴它有所帮助。考虑通过接受答案来结束这篇文章和/或发布您的解决方案,以补充和帮助未来来到这里的其他人。
  • 是的,我会的,但我可能还有一个小问题。 x 轴范围在 facet_grid 图中相互覆盖,因为有 9 个小图。有没有办法解决这个问题?
  • 您可以使用 theme() 图层参数增加面板之间的间距,例如theme(panel.spacing.x = unit(5, "mm"))。或者,您可以使用 scale() 调用为 x 轴的上限和下限添加一些填充:scale_x_discrete(expand=c(0.5, 0.5)。第三个选项是更改标签的方向:theme(axis.text.x = element_text(angle=-90, vjust=0.5))
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
相关资源
最近更新 更多