20组matplotlib绘图实战练习

2020-05-22 15:05:26 浏览数 (3)

以下练习数据来源均为seaborn库中提供,通过网络获取,如果出现网络获取慢或者失败的情况,可以到GitHub上搜索seaborn-data,下载后传入读取路径即可

代码语言:javascript复制
from matplotlib import pyplot as plt
import seaborn as sns

航班乘客变化分析

代码语言:javascript复制
data = sns.load_dataset("flights")
data.head()

分析年度乘客总量变化情况

按年度进行分组,并统计每个分组的总和数据

代码语言:javascript复制
year_data = data.groupby(by=['year']).sum()
plt.plot(year_data.index, year_data['passengers'], color='red', linewidth=1.5, linestyle='-', marker='.')
plt.title('Annual change graph')
plt.xlabel('Year')
plt.ylabel('Passengers')
plt.legend(['Annual'],)
plt.grid(True)
plt.show()

图中可以看出,从1949年-1960年的乘机人数来看,航空业发展迅速

分析乘客在一年中各月份的分布

按月度进行分组,并统计每个分组的总和数据

代码语言:javascript复制
month_data = data.groupby(by=['month']).sum()

plt.figure(figsize=(10,5))
plt.bar(month_data.index, month_data['passengers'], color='blue', alpha = 0.8)
plt.title('Annual change graph')
plt.xlabel('Month')
plt.ylabel('Passengers')
plt.ylim([0, 5000])
plt.xticks(list(month_data.index), list(month_data.index), rotation=60)

for x, y in zip(month_data.index, month_data['passengers']):
    plt.text(x, y   100, '%s' % y, ha='center')
plt.legend(['Annual'], loc='upper left')
plt.show()

图中可以看出,每年的七八月份是人数最多的

鸢尾花花型尺寸分析

代码语言:javascript复制
data = sns.load_dataset("iris", data_home='./seaborn-data')
data.head()

萼片(sepal)和花瓣(petal)的大小关系

要计算萼片和花瓣大小关系,我们是知道萼片长宽及花瓣长宽的,最简单的计算方式:长*宽

代码语言:javascript复制
# 萼片大小
sepal = data['sepal_length'] * data['sepal_width']

# 花瓣大小
petal = data['petal_length'] * data['petal_width']

plt.scatter(sepal, petal)
plt.xlabel('sepal')
plt.ylabel('petal')
plt.show()

图中可以看出,萼片大小与花瓣大小基本成正相关关系,图上还可以看到有特殊情况出现

不同种类(species)鸢尾花萼片和花瓣的大小关系

上面是对所有花的数据进行对比,不是很严谨,我们需要按花的类型进行分类后,再看每个分类里面的萼片与花瓣大小关系

代码语言:javascript复制
# 取出类型
species = data.species.unique()

# 每种类型定义不同颜色
colors = ['steelblue', '#9999ff', '#ff9999']

for i, spec in enumerate(species):
    # 按类型取出花的数据,并计算大小
    items = data[(data['species'] == spec)]
    sepal = items['sepal_length'] * items['sepal_width']
    petal = items['petal_length'] * items['petal_width']
    plt.scatter(sepal, petal, c=colors[i], label=spec)
plt.xlabel('sepal')
plt.ylabel('petal')
plt.legend(loc='upper left')
plt.show()

这幅图就很明确的可以看出,萼片与花瓣大小不成正比的花是同一类型,而其他两类都是成正相关关系

餐厅消费情况分析

代码语言:javascript复制
data = sns.load_dataset("tips", data_home='./seaborn-data')
data.head()
# 总消费,小费,性别,吸烟与否,就餐星期,就餐时间,就餐人数

小费和总消费之间的关系

代码语言:javascript复制
plt.scatter(data['total_bill'], data['tip'])
plt.xlabel('total_bill')
plt.ylabel('tip')

从图上可以看出,总消费和小费之间基本成正相关关系,即总消费高,小费给的也多一些

男性顾客和女性顾客,谁更慷慨

按照性别分组,展示小费数量

代码语言:javascript复制
tips = []
sexs = []
for sex, items in data.groupby(by=['sex']):
    sexs.append(sex)
    tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=sexs, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
plt.show()

从图上可以看出男女顾客在小费的平均值上相差不大,但是男女顾客中都存在小费给的比较高的情况,这方面男性顾客要更慷慨一些

抽烟与否是否会对小费金额产生影响

按照是否吸烟分组,展示小费数量

代码语言:javascript复制
tips = []
smokers = []
for smoker, items in data.groupby(by=['smoker']):
    smokers.append(smoker)
    tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=smokers, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
plt.show()

从图中可以看出,平均小费金额上吸烟顾客要给的高一点,但是特例情况中不吸烟的顾客给高小费的情况要比吸烟的顾客多

工作日和周末,什么时候顾客给的小费更慷慨

按照工作日分组,展示小费数量

代码语言:javascript复制
work_day = ['Mon', 'Tue', 'Wed', 'Thur', 'Fri']

# 增加一个是否工作日的记录
data['work'] = data['day'].isin(work_day)
data.head()
代码语言:javascript复制
tips = []
works = []
for work, items in data.groupby(by=['work']):
    works.append(work)
    tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=works, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})

从图中可以看出,周末小费给的更多一些,当然也可以是因为消费人多,毕竟周内大家都上班呢

午饭和晚饭,哪一顿顾客更愿意给小费

按照就餐时间分组,统计小费情况

代码语言:javascript复制
tips = []
times = []
for time, items in data.groupby(by=['time']):
    times.append(time)
    tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=times, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})

很明显晚餐的时候人们更愿意给小费,应该是晚餐的时候人们就餐时间长一些,所以更愿意给小费

就餐人数是否会对慷慨度产生影响

按照就餐人数分组,统计小费情况,因为数据当中就餐人数比较少,所以直接分组,如果人数变化大,可以先按照区间进行分组统计

代码语言:javascript复制
tips = []
sizes = []
for size, items in data.groupby(by=['size']):
    sizes.append(size)
    tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=sizes, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
plt.show()

从图上可以看出,随着就餐人数的增多,给予的小费也相对多了

性别 抽烟的组合因素对慷慨度的影响

按照性别和抽烟分组,统计小费情况

代码语言:javascript复制
tips = []
groups = []
for group, items in data.groupby(by=['sex', 'smoker']):
    groups.append(group)
    tips.append(items['tip'])
plt.boxplot(x=tips, patch_artist=True, labels=groups, showmeans=True, medianprops = {'linestyle':'--','color':'orange'})
plt.show()

从图中可以看出,男性抽烟和女性抽烟者均比同性别不抽烟的顾客给的小费多,女性抽烟者甚至比男性不抽烟者给的多,但是在高端小费领域男性不抽烟者就比较大气慷慨了


今天先到这里,明天我们在分析一下泰坦尼克号海难幸存者状况

0 人点赞