数据分析与可视化 上机实践4(Matplotlib 数据可视化)
一、实践目的
1.了解matplotlib库的基本功能。
2.掌握matplotlib库的使用方法。 
二、数据集介绍
食品偏好数据集统计了2019年不同国家人民对不同食物的偏好情况。数据共计288条,各数据字段含义如下表所示。

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
   | 
  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)  plt.ylim(-1,1)  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()
 
  | 
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | 
  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()
 
  | 
 

(2)对食品偏好数据集进行可视化处理
1 2 3 4 5
   | 
  import pandas as pd food=pd.read_csv('food.csv') food.head()
 
  | 
 

1 2 3 4
   | 
  food.drop(['Timestamp','Participant_ID'],axis=1,inplace=True)  food.head()
 
  | 
 
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | 
  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) 
  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()
 
  | 
 
1 2 3
   | 
  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)  plt.pie(x, labels=labels, explode=explode, startangle=60, autopct='%1.1f %%') plt.title('女性对甜点的偏好') plt.legend() plt.show()
   | 
 
1 2 3
   | 
  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)
 
  sns.boxplot(x=food['Age'], y=food['Juice'], data=food, orient='h')
 
  plt.xlabel('Age') plt.ylabel('Juice') plt.show()
   | 
 
1 2 3 4
   | 
 
  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') 
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13
   | plt.figure(figsize=(8,4),dpi=90)
 
  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']  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')  plt.xlabel('Age') plt.ylabel('Dessert') plt.legend() plt.show()   
   | 
 
1 2 3 4
   | #(8)根据所绘制的图形,分析人们对不同食物的偏好情况。
  # 在该图中,红色表示传统美食的偏好程度,蓝色表示西方美食的偏好程度。可以得出结论,在所有年龄段中人们似乎更喜欢传统美食。 # 其中在年龄20到40之间的人群对传统美食的偏爱程度较高,年龄在15到30之间的人群对西方美食偏爱程度较高。
   | 
 
五、参考资料
food.csv 数据集下载
 (5), (6), (7)中的可视化处理参考了chatgpt提供的解题思路