数据分析与可视化 上机实践4(Matplotlib 数据可视化)

一、实践目的

1.了解matplotlib库的基本功能。

2.掌握matplotlib库的使用方法


二、数据集介绍

食品偏好数据集统计了2019年不同国家人民对不同食物的偏好情况。数据共计288条,各数据字段含义如下表所示。

img-202304301405896

food.csv 数据集下载


三、实践内容要求

1、绘制正弦曲线,并设置标题、坐标轴名称和坐标轴范围;

2、同一坐标系下绘制多种曲线并通过样式、宽度和颜色加以区分;

3、对食品偏好数据集进行可视化处理。

(1)读取数据集,并显示前5行;

(2)删除无用特征Timestamp和Participant_ID;

(3)查看数据集的基本情况和统计信息;

(4)绘制不同国家参与者人数柱状图;

(5)利用饼形图分别绘制男性和女性对甜点的偏好;

(6)利用箱体图绘制不同年龄的人对果汁偏爱对比图;

(7)利用散点图绘制不同年龄的人对甜点的偏爱对比图(提示:年龄作为x轴,maybe,yes和no分别用0,1和-1来表示作为y轴,同时用不同颜色的散点表示Traditional Food和Western Food);

(8)根据所绘制的图形,分析人们对不同食物的偏好情况。


四、完成情况

(1)简单绘制曲线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1、绘制正弦曲线,并设置标题、坐标轴名称和坐标轴范围;

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False # 可以正常显示中文

%matplotlib inline
data=np.arange(0, np.pi*4, 0.01)
plt.figure(figsize=(4,3),dpi=120)

plt.title('sin(x) 正弦曲线')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(0,np.pi*4) # x轴范围
plt.ylim(-1,1) # y轴范围
plt.xticks([0, np.pi/2, np.pi, np.pi*3/2, np.pi*2, np.pi*5/2, np.pi*3, np.pi*7/2, np.pi*4]) # 具体刻度
plt.yticks([-1,-0.5,0,0.5,1])
plt.plot(data,np.sin(data)) # 绘制正弦曲线
plt.legend(['sin'])
plt.show()

img-202304291817274


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 2、同一坐标系下绘制多种曲线并通过样式、宽度和颜色加以区分;

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

plt.figure(figsize=(4,4),dpi=100)
data=np.arange(0,1,0.01)
plt.title('多种曲线样式')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(0,1)
plt.ylim(0,1)
plt.xticks([0,0.2,0.4,0.6,0.8,1])
plt.yticks([0,0.2,0.4,0.6,0.8,1])

plt.plot(data, 2.5*data, marker='^')
plt.plot(data, data**0.5, linewidth=4)
plt.plot(data, data**3, linewidth=3, linestyle='--', color='red')
plt.legend(['y=2.5*x','y=x^0.5', 'y=x^3'])

plt.show()

img-202304291817635


(2)对食品偏好数据集进行可视化处理

1
2
3
4
5
#(1)读取数据集,并显示前5行;

import pandas as pd
food=pd.read_csv('food.csv')
food.head()

img-202304291822462


1
2
3
4
#(2)删除无用特征Timestamp和Participant_ID;

food.drop(['Timestamp','Participant_ID'],axis=1,inplace=True) # 删除这两列,并替换原数据
food.head()
img-202304291822300
1
2
3
#(3)查看数据集的基本情况和统计信息;

food.info()
1
2
3
4
5
6
7
8
9
10
11
12
13
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 288 entries, 0 to 287
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Gender 284 non-null object
1 Nationality 288 non-null object
2 Age 288 non-null int64
3 Food 288 non-null object
4 Juice 288 non-null object
5 Dessert 288 non-null object
dtypes: int64(1), object(5)
memory usage: 13.6+ KB
1
food.describe()
003
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#(4)绘制不同国家参与者人数柱状图;

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['SimHei']

plt.figure(figsize=(7,6),dpi=100)
data=food['Nationality'].value_counts() # 统计不同国家参与者人数
data.plot(kind='bar',rot=30) #设置对应国家的列标签,并倾斜30度

plt.xlabel('国家')
plt.ylabel('人数')
plt.title('不同国家参与者人数柱状图')
plt.bar(range(len( data)),data)
for x,y in zip(range(len(data)),data):
plt.text(x,y,y,ha = 'center',va = 'bottom')
plt.show()
img-202304291817131
1
2
3
#(5)利用饼形图分别绘制男性和女性对甜点的偏好;

food.groupby('Dessert')['Gender'].value_counts() # 统计不同性别对甜点偏好的情况
1
2
3
4
5
6
7
8
Dessert  Gender
Maybe Female 72
Male 50
No Female 35
Male 17
Yes Female 58
Male 52
Name: Gender, dtype: int64

1
food['Gender'].value_counts() # 统计不同性别对应的人数,方便后面绘制饼图
1
2
3
Female    165
Male 119
Name: Gender, dtype: int64

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
plt.figure(figsize=(10,8),dpi=90)

plt.subplot(1,2,1)
labels=['Maybe','No','Yes']
x=[72/165, 35/165, 58/165]
explode=(0.01, 0.01, 0.01)
plt.pie(x, labels=labels, explode=explode, startangle=60, autopct='%1.1f %%') # 分别绘制男性和女性对甜点偏好的饼图
plt.title('男性对甜点的偏好')
plt.legend()

plt.subplot(1,2,2)
labels=['Maybe','No','Yes']
x=[50/119, 17/119, 52/119]
explode=(0.01, 0.01, 0.01) # autopct='%1.1f%%'参数表示在饼形图上显示每个部分的百分比
plt.pie(x, labels=labels, explode=explode, startangle=60, autopct='%1.1f %%')
plt.title('女性对甜点的偏好')
plt.legend()
plt.show()
img-202304291814755
1
2
3
#(6)利用箱体图绘制不同年龄的人对果汁偏爱对比图

food.groupby('Juice')['Age'].value_counts() # 先按对果汁的偏爱分组,再统计各自年龄对应的人数
1
2
3
4
5
6
7
8
9
10
11
12
13
Juice              Age
Carbonated drinks 21 5
23 4
25 3
22 2
24 2
..
Fresh Juice 60 1
63 1
65 1
67 1
74 1
Name: Age, Length: 66, dtype: int64

1
food['Juice'].value_counts()
1
2
3
Fresh Juice          256
Carbonated drinks 32
Name: Juice, dtype: int64

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(6,6),dpi=90)
# 为方便展示示例效果,这里使用seaborn库来绘制箱体图
# 生成一个水平方向的箱体图,其中每个箱子代表一种不同年龄段人群喜好某种果汁的程度
sns.boxplot(x=food['Age'], y=food['Juice'], data=food, orient='h')

# 设置横纵坐标标签
plt.xlabel('Age')
plt.ylabel('Juice')
plt.show()
img-202304291815783
1
2
3
4
#(7)利用散点图绘制不同年龄的人对甜点的偏爱对比图(提示:年龄作为x轴,maybe,yes和no分别用0,1和-1来表示作为y轴,同时用不同颜色的散点表示Traditional Food和Western Food)。
# pd.set_option('display.max_rows', 100) # 让数据显示更全

df=food.groupby('Dessert')['Age'].value_counts() # 统计不同年龄对甜点偏好的情况
1
2
3
plt.figure(figsize=(8,4),dpi=90)

plt.scatter(food['Age'], food['Dessert'], color='green') # 显示不同年龄,对应的甜品偏好情况
img-202304291815498
1
2
3
4
5
6
7
8
9
10
11
12
13
plt.figure(figsize=(8,4),dpi=90)

# 对原数据中对甜品的偏爱情况进行替换,y轴用这些来表示:Yes,Maybe和No分别用1,0和-1
traditional_likes = food[food['Food'] == 'Traditional food']['Dessert'].replace({'Yes': 1, 'Maybe': 0, 'No': -1})
western_likes = food[food['Food'] == 'Western Food']['Dessert'].replace({'Yes': 1, 'Maybe': 0, 'No': -1})

age = food['Age'] # x轴是在不同年龄下,人们对传统和西方食物的分布情况
plt.scatter(age[food['Food'] == 'Traditional food'], traditional_likes, color='red', label='Traditional food')
plt.scatter(age[food['Food'] == 'Western Food'], western_likes, color='blue', label='Western Food') # 西方美食对应 Western Food
plt.xlabel('Age')
plt.ylabel('Dessert')
plt.legend()
plt.show()
img-202304291816686
1
2
3
4
#(8)根据所绘制的图形,分析人们对不同食物的偏好情况。

# 在该图中,红色表示传统美食的偏好程度,蓝色表示西方美食的偏好程度。可以得出结论,在所有年龄段中人们似乎更喜欢传统美食。
# 其中在年龄20到40之间的人群对传统美食的偏爱程度较高,年龄在15到30之间的人群对西方美食偏爱程度较高。

五、参考资料

food.csv 数据集下载

(5), (6), (7)中的可视化处理参考了chatgpt提供的解题思路