使用 ggplot2 复制食物可视化的节奏
Posted
技术标签:
【中文标题】使用 ggplot2 复制食物可视化的节奏【英文标题】:using ggplot2 to replicate Rhythm of Food Visualization 【发布时间】:2017-06-23 20:03:59 【问题描述】:我正在尝试使用我自己的数据集来复制 Google Rhythm of Food 上的漂亮可视化效果,该数据集显示我的公司每周雇用了多少人。数据集(名为hiresbyweek)如下所示(这是 81 行中的 25 行,link to full dataset here)
Week Year total.Hires Month WeekNum
2014-05-05 0:00:00 2014 1 May 18
2014-05-12 0:00:00 2014 1 May 19
2014-05-19 0:00:00 2014 1 May 20
2014-05-26 0:00:00 2014 1 May 21
2014-08-04 0:00:00 2014 1 August 31
2014-09-08 0:00:00 2014 1 September 36
2015-02-23 0:00:00 2015 3 February 08
2015-03-23 0:00:00 2015 4 March 12
2015-05-04 0:00:00 2015 1 May 18
2015-06-01 0:00:00 2015 1 June 22
2015-06-08 0:00:00 2015 1 June 23
2015-09-14 0:00:00 2015 3 September 37
2015-09-21 0:00:00 2015 4 September 38
2015-09-28 0:00:00 2015 15 September 39
2015-10-05 0:00:00 2015 20 October 40
2015-10-12 0:00:00 2015 47 October 41
2015-10-19 0:00:00 2015 40 October 42
2015-10-26 0:00:00 2015 39 October 43
2015-11-02 0:00:00 2015 5 November 44
2015-11-09 0:00:00 2015 2 November 45
2015-11-16 0:00:00 2015 7 November 46
2015-11-23 0:00:00 2015 1 November 47
2015-11-30 0:00:00 2015 7 November 48
2015-12-07 0:00:00 2015 3 December 49
2015-12-14 0:00:00 2015 7 December 50
目前我已经做到了:
ggplot(hiresbyweek,aes( x=WeekNum, y=total.Hires,fill=as.factor(Year)))
+geom_histogram(stat="identity", aes( x=WeekNum, y=total.Hires,fill=as.factor(Year)))
+coord_polar()
+scale_fill_manual(values=c("#ACD9F4","#005DA6","#EC008C"))
+scale_x_discrete(labels = as.factor(hiresbyweek$Month))
+scale_y_discrete(expand=c(0.5,0))
+theme(text=element_text(family="Avenir")
, axis.ticks = element_blank()
, panel.grid = element_blank()
, panel.background = element_blank()
)
这会产生接近的结果:
本质问题是:
1) 这些标签与它们应该在的位置相差无几: 注意最大的数字是在 10 月,但根据图表,它们主要是在 4 月或 3 月。
物有所值:
1) 我想按照食物图表的节奏对这些标题进行分组和轮换,这样标签会更简单
2) 我想大大减小这些条的相对大小;我已将其作为计数(geom_historgram(stat="count") 或 stat="bin") 完成,但这使它们都相等并消除了规模的重要性,这是这里的关键。
3) 我想在条之间插入一些空格。我尝试在 ggplot(hiresbyweek,aes( x=WeekNum, y=total.Hires,colour="white",fill=as.factor(Year))) 和 geom_histogram(stat ="identity", aes( x=WeekNum, y=total.Hires,fill=as.factor(Year), color="white")) 这两个都奇怪地得到了一个粉红色的轮廓......
第一部分的帮助是最重要的(当时我觉得它很像样),但任何人都欢迎。感谢您的时间和想法。
【问题讨论】:
另外,我在编写此提交时注意到的项目:如果我清理上面代码中的格式,rstudio 似乎不喜欢它:我实际上将它作为一行粘贴到我的 rstudio 中工作。将其格式化为多行通常会破坏它。有人愿意向我解释为什么会这样吗?+
符号必须在行尾
真的吗?而不是前面?是吗?有趣的是,我喜欢前面加 + 的样子。就这样。
很难从您提供的数据中诊断出这一点。您的情节看起来大部分 total.hires 来自 2016 年,但您只提供了 2014-2015 年。根据您提供的数据运行您的代码,可以合理地显示 10 月份的最高柱。
公平点。我会考虑将完整文件发布为 csv
【参考方案1】:
我一直在等待其他人发布更好且不那么骇人听闻的答案,但我希望这会在此期间完成。
# 1. We can control the order of geom_bars based on the levels of the factor of X.
# So we make a new factor variable and ensure that the levels are in the order of
# < January1, January2, ..., February2, ..., December3, December4 >
hiresbyweek <- hiresbyweek[order(hiresbyweek$WeekNum),]
hiresbyweek$X <- factor(paste0(hiresbyweek$WeekNum, hiresbyweek$Month),
levels = unique(paste0(hiresbyweek$WeekNum, hiresbyweek$Month)))
# 2. But we don't want the axis labels to be: "Jan1, Jan2, Jan3, ..."
# Instead we'll extract only the month out of the X variable (though notice the weekNum
# variable was important so we could get the right order and distinct factor levels)
# But we also don't want repeated axis labels: "Jan, "Jan", "Jan", "Feb", "Feb", ....
# So try to place the unique axis label close to the middle, and leave the rest blank
# (ie. "", "Jan", "", "", "Feb")
makeLabels <- function(x)
x <- gsub("[0-9]", "", x)
labs <- c();
for (a in unique(x))
b <- rep("", length(x[x == a]))
b[ ceiling(length(x[x==a])/2) ] <- a
labs <- append(labs, b)
return(labs)
# 3. Angle the axis labels to imitate Google's Rhythm of Food
ang <- -360 / length(unique(hiresbyweek$X)) * seq_along(hiresbyweek$X)
ang[ang <= -90 & ang >= -300] <- ang[ang <= -90 & ang >= -300] -180
ggplot(hiresbyweek, aes( x = X, y = total.Hires,fill = as.factor(Year))) +
geom_histogram(stat="identity", width = 0.5) + # Use width arg for more space between bars
coord_polar() +
scale_x_discrete(labels = makeLabels) + # Apply getLabel function to X
scale_y_discrete(expand=c(0.5,0)) +
scale_fill_manual(values=c("#ACD9F4","#005DA6","#EC008C")) +
theme(axis.ticks = element_blank(),
panel.grid = element_blank(),
panel.background = element_blank(),
text = element_text(family="Avenir"),
title = element_blank(), # Remove all titles
axis.text.x = element_text(angle= ang)) # Apply angles to x-axis labels
结果:
【讨论】:
这太棒了,谢谢。间距部分也是我试图解决的一个问题,所以感谢您找到它。我制作了第二个版本,我将月份作为缩写词,认为这会使月份标签上的间距更加均匀,但实际上这似乎更令人不快,所以我留下了那个。如果有办法解决这个问题,我会很有趣。无论如何,这是一个了不起的改进,谢谢。以上是关于使用 ggplot2 复制食物可视化的节奏的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:使用patchwork包绘制ggplot2可视化结果的组合图(自定义图像的嵌入关系)使用patchwork包绘制ggplot2可视化结果的组合图(自定义组合形式)
R语言ggplot2可视化使用ggplot2包patchwork包在可视化结果(右上角)中插入logo图片
R语言ggplot2可视化:使用R原生plot函数为指定曲线下面的区域着色ggplot2可视化在曲线的特定下方添加分割线ggplot2为指定曲线下面的区域着色
R语言ggplot2可视化:修改已经创建的ggplot2可视化对象进行自定义的修改使用ggplot_build函数更改已经创建的可视化结果
R语言ggplot2可视化:拟合二次曲线(quadratic curve)并使用ggplot2进行可视化可视化两个响应变量和一个预测变量的二次曲线