ggplot2

之前一直觉得算法666,学习重点应该放在各种花样算法中,工作中老大让一天分析多个东西的话,来不及细究,只能用excel出结论,才发现自己只会画个简单的线形图柱状图之类,弱爆了…… 画图如此重要……想要的图出不来,憋死了……,转战ggplot

转载地址:点击打开链接

关于ggplot2包的基本功能介绍(下)

关于ggplot2包的基本功能介绍(下)

黄锐 黄锐
5 个月前

7. Statistical transformations

下面我们来看一下条形图。条形图看起来很简单,但却很有意思,因为它们揭示了一些图表中的微妙的信息。一个基本的条形图由geom-bar()语句来绘制。下面这幅图根据钻石数据组中的cut变量将其进行了分组。钻石数据组是ggplot2中自带的数据组,包含了大概54000颗钻石的信息,信息包括每颗钻石的price, carat, color, clarity和cut变量。图表表明了切割工艺较好的钻石其使用率会更高。

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))

X轴代表钻石的cut变量,Y轴表示数量,但是这里的数量并不是其数据组中的变量。那么这个数量的数据是从哪里来的呢?一些图表例如散点图等会直接将原始数据绘制在图表上,而另一些图表例如条形图则会自动计算新的数值来绘制:

  • 条形图,直方图和频率多边形图将数据存储在一起,然后计算每一个箱体中的数据数量。
  • 通常使用更平滑的模型来表示你的数据,这样你可以通过模型来进行预测。
  • 箱线图会计算一个更强大的分布概要,并且把它显示在一个特定格式的箱中。

计算程序为图表计算新值的过程被称作stat,这是Statistical transformations的略称。下面的数据展示了这个过程是如何通过geom-bar()函数来进行的。

你可以通过检查stat参数的默认值来了解geom使用哪个stat。例如,?geom-bar里说明了stat的默认的值是count,意思是geom_bar()函数会自动使用stat_count()。stat_count()记录在于geom_bar()相同 的页面上,如果向下滚动,您可以找到一个名为“计算变量”的部分。这部分会告诉它计算了两个新的变量:count和prop。

通常可以互换使用几何和统计。 例如,你可以使用stat_count()而不是geom_bar()重新创建前面的图。

ggplot(data = diamonds) +

  stat_count(mapping = aes(x = cut))

这是因为每个geom都有默认的stat值,同样每个stat都有一个默认的geom。 这意味着你通常可以使用geom而不用担心底层的统计变换。 你可能需要明确使用stat的三个原因:

1.你可能想要修改默认的stat值。 在下面的代码中,我将geom_bar()的stat从count(默认)更改为identity。 这样可以将条形图的高度映射到y变量的原始值。 不幸的是,当人们随便谈论条形图时,他们可能是指这种类型的条形图,其中条的高度已经存在于数据中,或者前一个条形图中,通过计数行来生成条的高度。

demo <- tribble(

  ~a,      ~b,

  "bar_1", 20,

  "bar_2", 30,

  "bar_3", 40

)

 

ggplot(data = demo) +

geom_bar(mapping = aes(x = a, y = b), stat = "identity")

2.你可能希望改变从变量到图表时的默认映射。 例如,你可能需要显示表示比例的条形图,而不是计数:

ggplot(data = diamonds) +

geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))

要查找由stat计算的变量,请查找名为“计算变量”的帮助部分。

3.你可能希望更加注意代码中的统计转换。 例如,你可以使用stat_summary(),它总结每个唯一x值的y值,以引起对你计算的摘要的注意:

ggplot(data = diamonds) +

  stat_summary(

    mapping = aes(x = cut, y = depth),

    fun.ymin = min,

    fun.ymax = max,

    fun.y = median

)

ggplot2提供超过20个统计信息供你使用。 每个统计都是一个功能,所以你可以用通常的方式获得帮助,例如 ?stat_bin。 要查看完整的统计列表,请尝试使用ggplot2的cheatsheet。

7.1练习

1.与stat_summary()关联的默认几何图表是什么?

2. geom_col()的功能是什么? 它与geom_bar()有什么不同?

3. 大多数的geom和stat都是成对的。阅读文档并列出所有对,他们有什么共同点?

4. stat_smooth()计算什么变量?什么参数控制其行为?

5.在我们的比例条形图中,我们需要设置group = 1为什么?换句话说,这两个图表有什么问题?

ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut, y = ..prop..))

  ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut, fill = color, y = ..prop..))

8. Position adjustments


还有一个与条形图相关的神奇功能,你可以使用colour或更有用地fill来绘制不同颜色的条形图:

ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut, colour = cut))

ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut, fill = cut))


请注意,如果将fill的功能映射到另一个变量,会发生什么,如清晰度:条形图被自动堆叠。每个彩色矩形表示切割和清晰度的组合。

ggplot(data = diamonds) +

  geom_bar(mapping = aes(x = cut, fill = clarity))

堆叠条形图会通过位置参数进行自动位置堆叠。如果您不想使用堆叠条形图,则可以使用“identity”,“dodge”或“fill”三种其他选项之一。

  • position =“identity”将使图表中的每个变量都单独成完整的一条。这对于条形图来说不是很有用,因为它们之间相互重叠。为了看到这个重叠,我们需要通过将alpha设置为一个小的值,使其稍透明,或者通过设置fill = NA使其完全透明。
ggplot(data = diamonds, mapping = aes(x = cut, fill = clarity)) +

  geom_bar(alpha = 1/5, position = "identity")

ggplot(data = diamonds, mapping = aes(x = cut, colour = clarity)) +

  geom_bar(fill = NA, position = "identity")
  • position =“fill”和堆叠图类似,但是它可以使每组堆叠的条形都具有相同的高度,这样可以更容易地比较组间的比例。
ggplot(data = diamonds) +

geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")
  • position =“dodge”将重叠对象直接放在一起,这会使得单个值的比较更容易。

还有一种其他类型的调整对条形图不起作用,但它对散点图非常有用。 回顾我们的第一个散点图。注意到没有,图表只显示了126个点,即使我们有234个观测值。

hwy和displacement的值被舍入取整,所以网格上的许多点都互相重叠。 这个问题被称为overploting, 这种安排使得它很难看到的数据的聚集情况。 数据点是否在整个图形中均匀分布,还是有一个包含其余108个值的hwy和displ的特殊组合方式?

你可以通过设置“jitter”参数来避免这种情况。 position =“jitter”给每个点添加少量随机噪声。 由于没有两点可能会接收到相同的随机噪声量,所以这使得数据点的分布得以扩展。

ggplot(data = mpg) +

  geom_point(mapping = aes(x = displ, y = hwy), position = "jitter")

添加随机噪音来改善你的图表似乎是一个奇怪的方法,虽然它在小规模的图表上降低了数据的精确度,但是同时它也使得大型图表能够表现出更多信息。 因为个功能非常有用,所以ggplot2提供了geom_point(position =“jitter”)的缩写方式:geom_jitter()。

要了解有关位置调整的更多信息,请查找与每个调整相关联的帮助页面:

?position_dodge,?position_fill,?position_identity,?position_jitter和?position_stack。

8.1练习

1.下面这幅图表有什么问题?怎么来改善它?

ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +

geom_point()

2. geom_jitter()的哪些参数控制jittering的数量?

3.将geom_jitter()与geom_count()进行对比。

4. geom_boxplot()的默认位置是什么样的? 创建一个mpg数据组的可视化图表。

9. Coordinate systems

坐标系可能是ggplot2中最复杂的部分。 默认坐标系是笛卡尔坐标系,其中可以对x和y位置独立地进行操作,以查找每个点的位置。 我们也偶尔会使用到一些其他类型的坐标系。

coord_flip()可以转换x轴和y轴。 这很有用,例如你想要画一个箱线图,但是它的标签很长,如果竖直放置的话很难让它的标签在x轴上没有重叠,这时就可以将箱线图竖直放置。

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +

  geom_boxplot() +

  coord_flip()

coord_quickmap()函数可以正确设置地图的宽高比。 如果你要用ggplot绘制一个空间的数据,那么这个功能是非常重要的。

nz <- map_data("nz")

 

ggplot(nz, aes(long, lat, group = group)) +

  geom_polygon(fill = "white", colour = "black")

 

ggplot(nz, aes(long, lat, group = group)) +

  geom_polygon(fill = "white", colour = "black") +

  coord_quickmap()

coord_polar()函数可以使用极坐标。 极坐标向我们展示了条形图和Coxcomb图之间的关系。

bar <- ggplot(data = diamonds) +

  geom_bar(

    mapping = aes(x = cut, fill = cut),

    show.legend = FALSE,

    width = 1

  ) +

  theme(aspect.ratio = 1) +

  labs(x = NULL, y = NULL)

 

bar + coord_flip()

bar + coord_polar()

9.1练习

1.使用coord_polar()将堆叠条形图转成饼图。

2.labs()的功能是什么? 阅读文档。

3. coord_quickmap()和coord_map()有什么区别?

4.下面的图表告诉了你关于cty和hwy之间的哪些信息? 为什么coord_fixed()函数很重要? geom_abline()有什么功能?

ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +

  geom_point() +

  geom_abline() +

  coord_fixed()

10. The layered grammar of graphics

在前面的章节中,你学到的不仅仅是如何制作散点图,条形图和箱线图。 你学到的是一些最基础的知识,有了这些基础知识你就可以做任何图表。 为了看到这一点,我们在我们的代码模板中添加位置调整参数,统计信息,坐标系和faceting:

ggplot(data = <DATA>) +

  <GEOM_FUNCTION>(

     mapping = aes(<MAPPINGS>),

     stat = <STAT>,

     position = <POSITION>

  ) +

  <COORDINATE_FUNCTION> +

  <FACET_FUNCTION>

我们的新模板需要七个参数,也就是模板中显示的括号中的单词。 在实践中,你很少需要提供所有七个参数来制作图表,因为ggplot2将为除数据,映射和geom函数之外的所有内容提供有用的默认值。

模板中的七个参数组成了图表的语法,这是一个正式的用于 绘制图表的语法系统。 图表语法是基于以下几点构建而成,你可以通过数据集,几何图形,一组映射,统计量,位置调整,坐标系和faceting的组合来唯一的绘制一个图表。

要了解它是如何工作的,请考虑如何从头构建一个基本图表:你可以从数据集开始,然后将其转换为想要显示的信息(通过统计功能)。

接下来,你可以选择几何图形来表示转换后的数据中的每个观察值。 然后,你可以使用图形的各种特性来表示数据中的变量,再将变量值映射到图形上。

然后,你将选择一个坐标系来放置图形。你将使用这些图形的位置(这本身就是一种视觉特性)来表示x和y变量的值。 到这一步,你已经创建了一个完整的图表,但是你还可以进一步调整坐标系中的各图形位置(a position adjustment)或将图形分割成子图(分面)。 你还可以通过添加一个或多个附加图层来扩展图表,其中每个附加图层都可以使用数据集,几何图形,一组映射,统计量和位置调整等参数信息。

你可以使用此方法构建你能想到的任何图表。 换句话说,你可以使用本章中学到的代码模板构建成百上千个独特的图表。

总结:

翻译这篇文章花了大概20小时,收获很大,不仅是在文章的内容上,更多的是锻炼了一种静下心来看英文文献的能力。kaggle上有很多精彩的数据分析和建模的案例,不得不说这些资料的质量要远高于我们在百度上搜到的一些结果,所以想要学号数据分析,英文是必须要迈过的一个槛(也要利用好google翻译)。

另外由于对数据可视化方面很感兴趣,也入手了一本大数据社群内前辈推荐的《ggolot2数据分析与图形艺术》,这本书对ggolot2的各项功能和函数有较为全面的讲解(打算简单读一遍然后当作字典来用),建议对这方面感兴趣的同学可以买回来看一看。ggplot2的优越性在于它创建了一套完整的绘图语法,相较于R自带的绘图语法,ggplot2使用起来更加简单明了,并且由于ggolot2是通过图层叠加的方式来绘图,所以它的灵活性也更大,但可惜目前ggplot2还只能用于绘制二维图表,希望能尽快推出三维图表的工具包。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值