使用ggplot2绘制R中的条形图

Son*_*Son 4 r ggplot2

我有一个数据框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
Run Code Online (Sandbox Code Playgroud)

我想使用这个数据框来绘制使用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")
Run Code Online (Sandbox Code Playgroud)

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

艾萨克

chl*_*chl 9

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

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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

+ coord_flip()IMO 可以更好地添加它.


你的代码有什么问题?

  1. ggplot()函数期望data.frame,它可以从中提取命名变量,例如美学参数x=y=.因此,首先,您需要将对象转换为正确的data.frame并将其命名,因为它可以通过aes()以下方式实现其值:

    toplot_noind <- as.data.frame(toplot_noind)
    names(toplot_noind) <- y
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 然后,x和y标签必须在aes()函数之外.我不使用,qplot()但我认为在那里使用xlab=ylab=工作正常.有了ggplot,我更喜欢labs()or xlab()/ ylab()functions.例如

  3. 你需要x表现为一个因素.

  4. 此处似乎没有必要使用闪避方面,因为您没有第二个交叉分类因子(请参阅使用示例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") 
Run Code Online (Sandbox Code Playgroud)