【问题标题】:plotting bar graphs in R using ggplot2使用 ggplot2 在 R 中绘制条形图
【发布时间】:2023-03-22 16:51:01
【问题描述】:

我有一个名为toplot_noind 的数据框,如下所示。

> toplot_noind

    Chang.1  Chang.2  Chang.3  Chang.4  Chang.5  Chang.6  Chang.7  Chang.8
18    150.3     84.61     31.45     11.08     -0.19    -57.83    -88.63    -98.39

我想使用这个数据框来使用 ggplot2 绘制条形图。

我不需要图表中的列名:Chang.1、Chang.2 等。

我希望这 8 个值 150.3、84.61、...、-98.39 出现在 y 轴上(18 不是值的一部分,它是行的名称)。

此外,由于有 8 个值,我希望 x 轴上有 8 个条形 - 每个都指向这些值中的每一个。

因此,我想在 x 轴上按顺序将这些条命名为 1(第 1 条)、2(第 2 条)、3、...、8。

另外,我想将 y 轴标记为“总预期利润”,将 x 轴标记为“溢价变化”。

下面显示的是我尝试做的,但它不起作用。实际上,我曾尝试阅读 ggplot2,但阅读的材料无法让我充分理解,但我需要在作业中使用此条形图。我提交的时间非常有限。

library(reshape)
library(ggplot2)

t<-ncol(toplot_noind)

a<-seq(1:t)

ggplot(toplot_noind, aes(x = a, y = toplot_noind, xlab="premium change", ylab="Total Expected Profit")) + 
 geom_bar(position = "dodge")

非常感谢所有可以帮助我的人。

艾萨克

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    你的意思是这样的吗? (我不确定你是否想在图表顶部添加值,所以我添加了它们,但如果你不需要它们,你可以安全地删除最后一行。)

    tmp <- c(150.3,84.61,31.45,11.08,-0.19,-57.83,-88.63,-98.39)
    dd <- data.frame(y=tmp, x=LETTERS[1:8])
    ggplot(dd, aes(x=x, y=y)) + geom_bar(fill="darkgrey") + 
      labs(x="Premium change", y="Total Expected Profit") + 
      geom_text(aes(x=x, y=ifelse(y>0, y+5, y-5), 
                label=y), size=4, colour="white")
    

    添加+ coord_flip(),IMO 会更好。


    您的代码有什么问题?

    1. ggplot() 函数需要一个 data.frame,它可以从中提取命名变量,例如用于美学参数x= 和y=。所以,首先,你需要将你的对象转换成合适的data.frame并命名,因为你可以通过aes()来取值:

      toplot_noind <- as.data.frame(toplot_noind)
      names(toplot_noind) <- y
      

      使用与 data.frame 相同的名称更好。 (但请注意,它将通过强制转换操作继承其名称。)

    2. 然后,x 和 y 标签必须在 aes() 函数之外。我不使用qplot(),但我认为使用xlab= 和ylab= 可以正常工作。对于ggplot,我更喜欢labs() 或xlab()/ylab() 函数。例如

    3. 您需要将x 表示为一个因素。

    4. dodge 方面在这里似乎没有必要,因为您没有第二个交叉分类因素(请参阅help(position_dodge) 中的使用示例)。

    总之,您更正后的代码如下所示:

    toplot_noind <- as.data.frame(toplot_noind)
    ggplot(toplot_noind, aes(x = as.factor(1:8), y = toplot_noind)) + 
      geom_bar() +
      xlab("premium change") + 
      ylab("Total Expected Profit") 
    

    【讨论】:

    • 你好 Chl,图前的第一个很强大。非常感谢。第二个同样有效,但它说 y 找不到。
    • 你好 Chl,图前的第一个很强大。非常感谢。但是,这是警告消息警告消息:当 ymin != 0 时未明确定义堆叠。第二个代码也有效,但它说 y 找不到。现在我可能的问题是将值放在 c() 中。这是因为数据框 toplot_noind 是我的主程序的一部分。所以我想要做的是能够直接在代码中使用数据框 toplot_noind 而不必使用 c() 将值放在一起。这意味着在程序执行后,我将在使用之前从 R 复制 toplot_noind
    • @Son 警告信息不重要。对于第二个问题,要么将toplot_noind 保留或转换为data.frame(检查其列名是否恢复为toplot_noind),要么像我一样重命名它(names(toplot_noind) &lt;- y),在这种情况下你需要aes(x=as.factor(1:8), y=y) (我的错!)。
    猜你喜欢
    • 2017-09-27
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2013-04-08
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多