R 条形图ggplot2上的标签 我有如下数据。我试图创建一个条形图来显示收入与目标的对比。

R 条形图ggplot2上的标签 我有如下数据。我试图创建一个条形图来显示收入与目标的对比。,r,ggplot2,R,Ggplot2,黑条表示2015年第一天的当前收入。它几乎是实时数据,每天或每6小时更新一次。所以黑条每天都在增加。红色条表示达到第一个目标的收入金额。白色条表示达到第二个目标的收入金额 我的问题是如何创建标签以显示每个条形图的值,如下图所示。每个条上都需要三角形。提前感谢! df = data.frame(revenue = runif(306, min = 10, max = 20), day = seq(1,306,1), year = rep(

黑条表示2015年第一天的当前收入。它几乎是实时数据,每天或每6小时更新一次。所以黑条每天都在增加。红色条表示达到第一个目标的收入金额。白色条表示达到第二个目标的收入金额

我的问题是如何创建标签以显示每个条形图的值,如下图所示。每个条上都需要三角形。提前感谢!
df = data.frame(revenue = runif(306, min = 10, max = 20),
               day = seq(1,306,1),
               year = rep(2015,306))
df = aggregate(revenue~year, data = df, sum)
b1 = 5200
b2 = 6000
df = cbind(df,b1,b2)
df$year = as.factor(df$year)

ggplot(df, aes(year,b2)) +
  geom_bar(fill = "white", width=.1, stat="identity")+
  geom_bar(aes(year, b1), fill  = "red", width=.1, stat="identity")+
  geom_bar(aes(year, revenue), fill = "black",
           width=.1, stat="identity") +
  coord_flip()

11月3日编辑 我对原始代码做了一些调整,并尝试使用
geom_point()
在绘图中添加三角形。但我无法移动杆下的三角形。有什么想法吗

df = data.frame(year = factor(2015),revenue = 4300, goal1 = 5200, goal2 = 6000)
df2 = data.frame(year=factor(2015),label=c("revenue","goal1","goal2"),value=c(4300,5200,6000))

ggplot(df, aes(year,goal2)) +
  geom_bar(fill = "white", width=.1, stat="identity")+
  geom_bar(aes(year, goal1), fill  = "blue", width=.1, stat="identity")+
  geom_bar(aes(year, revenue), fill = "red",
           width=.1, stat="identity") +
  geom_text(data = df2, aes(year,value, label=paste(label,"\n",value), 
                vjust=ifelse(label=="revenue",2,-1)), size = 5) +
  geom_errorbar(aes(yintercept = goal1, ymax=goal1, ymin=goal1),
                 color = "black", size = 1, width=.1)+
  geom_point(data = df, aes(year, revenue), shape = 17, size = 5,  col = "firebrick4", bg = "firebrick4") + coord_flip()

首先,您需要将数据转换为一列,将“目标”和“收入”(在绘图上共享一种类型(货币)和一个维度(x))转换为一列,并将其标签(注释)转换为另一列:

df2 = data.frame(year=factor(2015),
                 label=c("revenue","goal 1","goal 2"),
                 value=c(4533,5200,6000))
为了使条形图以正确的顺序重叠,您最初按该特定顺序添加了几何图形条形图(如果您的值顺序不正确,则会失败)。现在,只需调用geom_bar即可绘制它们,通过重新排序标签因子并根据值排列数据,即可解决正确的分层问题:

ggplot(arrange(mutate(df2,label=reorder(label,value,sum)),-value)) + 
  scale_fill_manual(values=c(revenue="red",`goal 1`="blue",`goal 2`="white"),guide="none") +
  geom_bar(aes(year, value, fill=label),stat="identity", position="identity",alpha=1,width=0.1) +
  geom_text(aes(year,value, label=paste(label,"\n",value), vjust=ifelse(label=="revenue",2,-1))) +
  coord_flip()
并添加geom_文本来标记它们。对不起,我只是选择了随机颜色


注:

vjust
使用起来相当烦人,它是以文本显示框高度的倍数来衡量的。只要调整它,直到它是正确的。可能使用两个geom_文本输出标签和值

可以根据需要使用几何图形文本或几何图形点添加三角形

或者,放弃自动x轴标签,并使用x轴显示实际值。这将符合塔夫特斯的建议。如果收入接近某个目标,您可能需要处理标签重叠问题(基本图处理此问题,但ggplot不处理)


更新 OP请求帮助定位指针三角形。这里有一个使用自定义位置调整的可能解决方案。我还将其设置为使收入始终处于首位(使用新的zorder列)

勾号与本例中的文本不在同一侧-请自行修复


我不清楚你为什么强调数据的实时性。(在任何情况下,每6小时几乎都是实时的)。R脚本不是被动的或异步的(默认情况下),因此实时与静态没有什么不同。你是在要求某人解决实时问题,还是只是添加标签?嗨,Alex,非常感谢!我希望当收入达到目标1时,红条会覆盖蓝条。所以我坚持我的方式来创造酒吧。我仍然在为三角形的位置而挣扎。我刚刚编辑了我的问题。看看你有什么想法?
df2 = data.frame(year=factor(2015),label=c("revenue","goal 1","goal 2"),value=c(4533,5200,6000),zorder=c(3,2,1))
df2.ordered=arrange(mutate(df2,label=reorder(label,zorder,sum)),zorder)

ggplot(df2.ordered) + aes(x=year, y=value, fill=label) +
  scale_fill_manual(values=c(revenue="red",`goal 1`="blue",`goal 2`="white"),guide="none") +
  geom_bar(stat="identity", position="identity",alpha=1,width=0.1) +
  geom_text(aes(label=paste(label,"\n",value), vjust=ifelse(label=="revenue",2,-1))) +
  geom_point(aes(x=year, y=value, fill=2), hjust=100, fill= 1, shape = 17, size = 5, hjust=-300, col = "firebrick4", 
             bg = "firebrick4", position=c(adjust=function(data)mutate(data,x=x-0.05))) +
  coord_flip()