前言
A change of perspective is worth 80 IQ points Alan Kay
著名计算机科学家、艾伦·凯说过,换一个角度看问题值80点智商。
因为之前写了一篇宝可梦反应很好,所以我决定以后的原始数据尽量用宝可梦代替啦!本期要画的是Diverging Bars 因为不知道中文怎么翻译,我就按自己的感觉来命名了,我叫他杠杆条感觉挺像那么回事。带着一个问题来开始吧:前18编号的宝可梦,从妙蛙种子到比雕的攻击差距是怎样的?
例10
import pandas as pd
# Prepare Data
df = pd.read_csv("Pokemon.csv")
df = df[:][:18]
x = df['Attack']
df['Attack_z'] = (x - x.mean())/x.std()
df['colors'] = ['red' if x < 0 else 'green' for x in df['Attack_z']]
df.sort_values('Attack_z', inplace=True)
df.reset_index(inplace=True)
# Draw plot
plt.figure(figsize=(14,10), dpi= 80)
plt.hlines(y=df.index, xmin=0, xmax=df.Attack_z, color=df.colors, alpha=0.4, linewidth=5)
# Decorations
plt.gca().set(ylabel='$Model$', xlabel='$Mileage$')
plt.yticks(df.index, df.Name, fontsize=12)
plt.title('Diverging Bars of Car Mileage', fontdict={'size':20})
plt.grid(linestyle='--', alpha=0.5)
plt.show()
解析
看下数据表的样子
# | Name | Type_1 | Type_2 | Total | HP | Attack | Defense | Sp. Atk | Sp. Def | Speed | Stage | Legendary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Bulbasaur | Grass | Poison | 318 | 45 | 49 | 49 | 65 | 65 | 45 | 1 | False |
1 | 2 | Ivysaur | Grass | Poison | 405 | 60 | 62 | 63 | 80 | 80 | 60 | 2 | False |
2 | 3 | Venusaur | Grass | Poison | 525 | 80 | 82 | 83 | 100 | 100 | 80 | 3 | False |
3 | 4 | Charmander | Fire | NaN | 309 | 39 | 52 | 43 | 60 | 50 | 65 | 1 | False |
4 | 5 | Charmeleon | Fire | NaN | 405 | 58 | 64 | 58 | 80 | 65 | 80 | 2 | False |
5 | 6 | Charizard | Fire | Flying | 534 | 78 | 84 | 78 | 109 | 85 | 100 | 3 | False |
6 | 7 | Squirtle | Water | NaN | 314 | 44 | 48 | 65 | 50 | 64 | 43 | 1 | False |
7 | 8 | Wartortle | Water | NaN | 405 | 59 | 63 | 80 | 65 | 80 | 58 | 2 | False |
8 | 9 | Blastoise | Water | NaN | 530 | 79 | 83 | 100 | 85 | 105 | 78 | 3 | False |
9 | 10 | Caterpie | Bug | NaN | 195 | 45 | 30 | 35 | 20 | 20 | 45 | 1 | False |
10 | 11 | Metapod | Bug | NaN | 205 | 50 | 20 | 55 | 25 | 25 | 30 | 2 | False |
11 | 12 | Butterfree | Bug | Flying | 395 | 60 | 45 | 50 | 90 | 80 | 70 | 3 | False |
12 | 13 | Weedle | Bug | Poison | 195 | 40 | 35 | 30 | 20 | 20 | 50 | 1 | False |
13 | 14 | Kakuna | Bug | Poison | 205 | 45 | 25 | 50 | 25 | 25 | 35 | 2 | False |
14 | 15 | Beedrill | Bug | Poison | 395 | 65 | 90 | 40 | 45 | 80 | 75 | 3 | False |
15 | 16 | Pidgey | Normal | Flying | 251 | 40 | 45 | 40 | 35 | 35 | 56 | 1 | False |
16 | 17 | Pidgeotto | Normal | Flying | 349 | 63 | 60 | 55 | 50 | 50 | 71 | 2 | False |
17 | 18 | Pidgeot | Normal | Flying | 479 | 83 | 80 | 75 | 70 | 70 | 101 | 3 | False |
代码流程
载入数据,截取前18行,单独取出攻击离这一列
计算样本标准差 ,和标准化
增加一列标记,正用绿色,负用红色
进行排序
画图
标注
方法参数解释
复习一下 表格基本操作
df = df[:][:18] # 【:】选择所有列【:18】选择前18行
x = df['Attack'] #按列名选取列
df['Attack_z'] = (x - x.mean())/x.std() # 增加一列 列名 Attack_z
(x - x.mean())/x.std()
标准化,减去平均数 除以标准差。不说了,我复习概率统计去了。std() 在pandas 中默认除以(N-1)
sort_values(inplace=True)
排序,inplace:是否替换原来的数据
plt.hlines() 水平线
- xmin=0, xmax=df.Attack_z ;起点,终点
- linewidth 线宽度
plt.yticks()
- 第一个,刻度表示间隔的距离,
- 第二个,表示刻标,标签的名字,这里覆盖hlines的y标签
图像
应用
从攻击力看,最强的既然不是喷火龙。大针蜂的攻击还是有前途的。铁甲蛹光荣垫底预料之中。用宝可梦的高级进化来和小宝宝状态比较能力显然不公平,我们可以利用 Stage 字段筛选掉不是最高级进化的宝可梦。动手试试吧。还有几个不同的形式比如,带数值线图,点图。不做赘述,感兴趣的同学可以尝试,下期中会稍加说明。
例11
例12
下期预告
标注 —— 强调的你像表达的信息
例程来自:https://www.machinelearningplus.com/plots/matplotlib-histogram-python-examples//
感谢b站UP "菜菜TsaiTsai" 分享这个博客.