数据分析50图(四) —— 热点计数图

数据分析50图(四) —— 热点计数图

前言

华罗庚说过

数缺形时少直观,形少数时难入微.

这句话第一次听还是初中数学老师上二次方程课时说的.最近看到了3blue1brown对线性代数的直观解释感觉豁然开朗,于是我又捡起了儿时对美妙数学的兴趣. 发现一个博客,数据可视化很好的例子,决定花些时间和大家一起解读一下

例程来自:https://www.machinelearningplus.com/plots/matplotlib-histogram-python-examples//

感谢b站UP "菜菜TsaiTsai" 分享这个博客.

接着上期留下的问题,我们把不同的气缸数和百公里加速作为平面图的x,y轴以此观察他们的关系。但是许多车型会有相同的参数,比如有3种车型都是2.0L排量,4秒百公里时速。这时画出的点就会重合在一起,那么我们怎样才能把这个热度在图标上体现出来呢?

数据表地址https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv

例5

from matplotlib import patches
from scipy.spatial import ConvexHull
import warnings; warnings.simplefilter('ignore')
import seaborn as sns
sns.set_style("white")

# Import Data
df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")

fig, ax = plt.subplots(figsize=(16,10), dpi= 80)    
sns.stripplot(df.cty, df.hwy, jitter=1, size=8, ax=ax, linewidth=.5)

# Decorations
plt.title('Use jittered plots to avoid overlapping of points', fontsize=22)
plt.show()

解析

先看下原始数据,我们选用城市道路油耗(cty)和高速道路油耗(hwy)作为要画的平面点。复习一下怎么选取表格中的列:df[["cty",'hwy']]

cty hwy
0 18 29
1 21 29
2 20 31
3 21 30
4 16 26
5 18 26
6 18 27
7 18 26
。。。 。。。 。。。

解析下代码流程

  1. 导入数据表
  2. 设置画布尺寸等
  3. 画图
  4. 标注 图表的头和轴的名字等等信息

方法参数解释

  • stripplot() 散点图方法

    这次代码不多我们不妨先不急着运行例子。sns.stripplot() 中有一个不太明白意思的参数 jitter 可以删掉他看看会怎么样【图1】我们观察x轴为20的列 明显有些点颜色深,这就是因为重叠了。然后我们看看 jitter 参数怎么解决这个问题的【图2】就像他的意思“抖动”一样,就好像这个图是一个手脚不利索的老人画的,他总是不能精确的把点画在同一个地方。可是这并没有解决问题,我们只是很明显的知道这里有许多同样的点,并不能帮助们进一步分析数据。我们需要更加定性的分析,所以接下去再看一个例子。

图像

数据分析50图(四) —— 热点计数图_第1张图片
without_jitter.png
数据分析50图(四) —— 热点计数图_第2张图片
jitter.png

例6

df_counts = df.groupby(['hwy', 'cty']).size().reset_index(name='counts')

# Draw Stripplot
fig, ax = plt.subplots(figsize=(16,10), dpi= 80)    
sns.stripplot(df_counts.cty, df_counts.hwy, size=df_counts.counts*2, ax=ax)

# Decorations
plt.title('Counts Plot - Size of circle is bigger as more points overlap', fontsize=22)
plt.show()

解析

这2个图的关联很大,所以我决定把2期放在一起,更能保持读者的思维。

解析下代码流程

  1. 把重复的参数次数提取出来
  2. 设置画布尺寸
  3. 画图
  4. 标注信息

方法参数解释

没有新参数引入,简单介绍下 df.groupby() 和数据库的 groupby 相同,他把表按关键字中值相同的分成一组。 比如:运动会上按身高分组,把同样是155cm的10个人分一组,160cm的7个人分一组等等。

df_counts = df.groupby(['hwy', 'cty']).size().reset_index(name='counts') 看下这句话不禁的感叹 python 的易用性,这句话就好像是口述说明一样:把 dfhwy、cty 分组计算出个数(每组的长度)并把这个新的列命名为 counts

图像

数据分析50图(四) —— 热点计数图_第3张图片
counts_plot.png

应用

刚才我们能看到重合的点了,但是不能定量的分析他。这里我的解决办法是引入一个新的维度来展现重复次数(热度)。

先思考一个问题平面图上可以利用的维度有那些? 你可别急着看下去,提示下我们曾经在平面上表示三维物体的坐标。

平面相交直线确定一点,所以显然的 x,y 坐标是2个,我们需要表达第三个变量时还能想到等高线图,在一个平面图像上表示高度,还有颜色也可以利用。还有什么呢?我暂时还没想到。回到正题上这里作者巧妙的用点的大小来表示同一个型号热度,图像既美观有直观。可是我们需要更加具体的分析热度大小这还是不够的。下期我们将结核直方图和着张图来更深入的分析给出更好的热点图。

下期预告

例7 带频次统计的散点图 —— 中值计算

你可能感兴趣的:(数据分析50图(四) —— 热点计数图)