宝可梦分布8张图,统计占比的时候别再画饼图了
——数据可视化50图(十四)
前言
本文主要研究了总用800值精灵,18种主属性的数量,和对应的能力值分布。并用50张图表从不同角度分析个个数据之间的关系。头条不能插入表格,数据表见文后链接。
本期展示7种分布比较图:赛道分布;箱图;箱点图;赛艇图/小提琴图;金字塔图。曲奇饼干图,披萨饼图,地砖图。
#导入数据
df_raw=pd.read_csv(r'https://raw.githubusercontent.com/ub3132003/pynotebook/master/data/pokemon.csv')
例24 赛道分布点图
# Draw horizontal lines
fig, ax = plt.subplots(figsize=(16,10), dpi= 80)
ax.hlines(y=df.index, xmin=0, xmax=800, color='gray', alpha=0.5, linewidth=.5, linestyles='dashdot')
# Draw the Dots
for i, make in enumerate(df[manufacturer]):
df_make = df_raw.loc[df_raw[manufacturer]==make, :]
ax.scatter(y=np.repeat(i, df_make.shape[0]), x=cty, data=df_make, s=75, edgecolors='gray', c='w', alpha=0.5)
ax.scatter(y=i, x=cty, data=df_median.loc[df_median.index==make, :], s=75, c='firebrick')
图像解释
赛道图在第十期出平均能力排行中出现过,赛道的作用让不同分组的次序一目了然
点表示该位置出现的单个个体,颜色越深表示出现越密集。红点是中位数位置。
不同颜色对应不同属性;
Y轴 18种主属性。
X轴 能力值100-800范围。
例 25 箱图
# Import Data
df = df_raw#[df_raw["Generation"]==1]
x="Type 1"
y='Total'
# Draw Plot
plt.figure(figsize=(24,10), dpi= 80)
sns.boxplot(x=x, y=y, data=df, notch=False)
# Add N Obs inside boxplot (optional)
def add_n_obs(df,group_col,y):
medians_dict = {grp[0]:grp[1][y].median() for grp in df.groupby(group_col)}
xticklabels = [x.get_text() for x in plt.gca().get_xticklabels()]
n_obs = df.groupby(group_col)[y].size().values
for (x, xticklabel), n_ob in zip(enumerate(xticklabels), n_obs):
plt.text(x, medians_dict[xticklabel]*1.01, "num:"+str(n_ob), horizontalalignment='center', fontdict={'size':15}, color='white')
add_n_obs(df,group_col=x,y=y)
图像解释
- 与刚才的箱图相同不同的是用颜色标记进化的阶段。
- 0表示退化,比如皮卡丘的宝宝退化皮丘就被记作0阶段进化。还有小卡比,小电击兽等
- 4表示mega进化
- 可以看出水,火,草 御三家很多都有三阶段进化,此外岩石系也是3进化较多的。
- 结合箱图和散点图,点能够看到该y值上具体有多少个值
例 26 箱点图
x="Type 1"
y='Total'
df = df_raw[df_raw["Generation"]<3]
plt.figure(figsize=(24,10), dpi= 80)
sns.boxplot(x=x, y=y, data=df, hue='Stage')
sns.stripplot(x=x, y=y, data=df, color='black', size=3, jitter=1)
图像解释
与刚才的箱图相同不同的是用颜色标记进化的阶段。
0表示退化,比如皮卡丘的宝宝退化皮丘就被记作0阶段进化。还有小卡比,小电击兽等
4表示mega进化
可以看出水,火,草 御三家很多都有三阶段进化,此外岩石系也是3进化较多的。
结合箱图和散点图,点能够看到该y值上具体有多少个值
例27 小提琴图/龙舟图
sns.violinplot(x=x, y=y, data=df, scale='width', inner='quartile')
图像解释
- 宽度表示对应y轴的数量,越宽表示数量越多;比如第一个草系宝可梦,大部分都在300-500的个体值,超过600和低于200的都比较少。
- 宝可梦分布比较平均,如果有一段值特别多那么这个图会看起来像个小提琴。这里看起来像个龙舟。
例28 金字塔图
# Read data
df = pd.read_csv(r"..\data\pokemon_2.csv")
# Draw Plot
plt.figure(figsize=(13,10), dpi= 80)
group_col = 'Generation'
order_of_bars = df.Stage.unique()
colors = [plt.cm.Spectral(i/float(len(df[group_col].unique())-1)) for i in range(len(df[group_col].unique()))]
for c, group in zip(colors, df[group_col].unique()):
print(group)
sns.barplot(x='count', y='Stage', data=df.loc[df[group_col]==group, :], order=order_of_bars, orient='h',color=c, label=group)
图像解释
- 特别适合表示阶段逐级增长的数据,比如网购时候,浏览,收藏,购买数据也是逐级的。
- X轴 负值表示二世代宝可梦数量,正值表示一世代宝可梦数量,
- Y轴 进化阶段。0阶段是宝宝退化。比如皮卡丘退化皮丘。
- 颜色 表示 4种属性
- 数据为第一代和第二代,251只宝可梦
函数解释 sns.barplot,画条状图
- order=order_of_bars 需要按数量顺序方砖块,不然看起来就不像金字塔了。
- orient='h' 水平画,‘v’ 则是垂直画
中场休息,你怎么只会画饼图
加入你在一家电商公司。老板让你统计一下app,网站,微信的产品购买占比。然后你做了一个饼图。老板又让你统计下,食品、日用品、电器的销售额占比。然后你画了一个饼图。于是你的ppt出现了5、6张饼图。老板怒了曰:你家是卖饼的吗?看完我下面的文章你就不会再挨骂了。
例29 曲奇饼图
from pywaffle import Waffle
# Import
df=df_raw #
class1="Generation"
class2="Type 1"
# Draw Plot and Decorate
fig = plt.figure(
FigureClass=Waffle,
plots={
'211': {
'values': df['counts'],
'labels': [f"{n[0]} ({n[1]})" for n in df[[class1, 'counts']].itertuples()],
'legend': {'loc': 'upper left', 'bbox_to_anchor': (1.05, 1), 'fontsize': 12},
'title': {'label': '# Vehicles by Class', 'loc': 'center', 'fontsize':18}
},
'212': {
'values': df_make['counts_make'],
'labels': ["{1}".format(n[0], n[1]) for n in df_make[[class2, 'counts_make']].itertuples()],
'legend': {'loc': 'upper left', 'bbox_to_anchor': (1.05, 1), 'fontsize': 12, 'title':'Manufacturer'},
'title': {'label': '# Vehicles by Make', 'loc': 'center', 'fontsize':18},
'colors': colors_make
}
},
rows=18,
colors=colors,
figsize=(16, 9)
)
图像解释
- 一小格表示一个宝可梦
函数解释
- 第一次使用需要安装pywaffle 包。 命令行输入。pip install pywaffle
- '211': { 共2行一列,第一张图
- colors 复习颜色映射的使用方法plt.cm.Set3(num),cm获取颜色对象。让后构造(r,g,b,a)为元素的数列
例 30 饼图
x="Type 1"
# Prepare Data
df = df_raw.groupby(x).size()
# Make the plot with pandas
df.plot(kind='pie', subplots=True, figsize=(8, 8))
plt.title("宝可梦属性占比")
plt.ylabel("")
图像解释
- 不解释
例 31披萨饼图
# Draw Plot
fig, ax = plt.subplots(figsize=(12, 7), subplot_kw=dict(aspect="equal"), dpi= 80)
data = df['counts']
categories = df[x]
explode = [0,0,0,1] #np.zeros(3, dtype = int, order = 'C')
#explode[2]=1
def func(pct, allvals):
absolute = int(pct/100.*np.sum(allvals))
return "{:.1f}% ({:d} )".format(pct, absolute)
wedges, texts, autotexts = ax.pie(data,
autopct=lambda pct: func(pct, data),
textprops=dict(color="w"),
colors=plt.cm.Dark2.colors,
startangle=140,
explode=explode)
函数解释
**ax.pie() ** 画饼
- autopct 标注文字 百分比和数量
- lambda 表达式 pct: func(pct, data) 输入为pct 返回值是func函数的返回值
- colors=plt.cm.Dark2.colors 自动使用颜色映射 Dark2
- explode=explode 布尔数列,为真的位置会分离出来
- ax.legend()标签栏
例32 地砖图
# Prepare Data
df=df_raw[pd.isnull(df_raw["Type 2"])]
df = df.groupby('Type 1').size().reset_index(name='counts')
labels = df.apply(lambda x: str(x[0]) + "\n (" + str(x[1]) + ")", axis=1)
sizes = df['counts'].values.tolist()
colors = [plt.cm.Spectral(i/float(len(labels))) for i in range(len(labels))]
# Draw Plot
plt.figure(figsize=(10,14), dpi= 80)
squarify.plot(sizes=sizes, label=labels, color=colors, alpha=.8)
图像解释
- 数据取没有副属性的宝可梦
- 块砖表示一种属性
结论
看了这篇文章的下次可别用饼图啦。
下期预告
宝可梦数据要告一段落了,因为之后会开启时间序列图这个系列,需要更好的展示效果
由于篇幅所限文章代码省略了数据标准化,和画板标注的代码。完整代码见我的github:https://github.com/ub3132003/pynotebook/blob/master/plot/50%20graph.ipynb
灵感来自: machinelearningplus 感谢b站UP "菜菜TsaiTsai" 分享这个博客.
上期内容:
如何运行代码教程:数据分析50图(前8例总结) —— 宝可梦能力值可视化