Python读取‘新生数据.xls’,绘制各省男女人数堆叠柱形图(横坐标为各省,纵坐标为人数
时间: 2023-05-26 20:04:52 浏览: 48
由于XLS文件读取方式比较麻烦,这里我们将其先转为CSV格式,然后再读取。
首先,需要用Excel将‘新生数据.xls’文件另存为CSV格式,保存为‘新生数据.csv’。
然后,我们就可以使用pandas库读取该CSV文件:
```python
import pandas as pd
df = pd.read_csv('新生数据.csv', encoding='GBK')
```
接下来,我们需要对数据进行处理。首先,我们需要按省份对男女人数进行统计,然后将其转化为堆叠柱形图需要的数据格式。
```python
# 统计各省男女人数
province_data = {}
for i in range(len(df)):
row = df.iloc[i]
province = row['省']
sex = row['性别']
if province not in province_data:
province_data[province] = {'男': 0, '女': 0}
if sex == '男':
province_data[province]['男'] += 1
else:
province_data[province]['女'] += 1
# 转化为堆叠柱形图需要的数据格式
data = {'province': [], 'male': [], 'female': []}
for province in province_data:
data['province'].append(province)
data['male'].append(province_data[province]['男'])
data['female'].append(province_data[province]['女'])
```
最后,我们就可以使用matplotlib库绘制堆叠柱形图:
```python
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 绘制堆叠柱形图
fig, ax = plt.subplots()
ax.bar(data['province'], data['male'], label='男')
ax.bar(data['province'], data['female'], bottom=data['male'], label='女')
ax.set_xlabel('省份')
ax.set_ylabel('人数')
ax.legend()
plt.show()
```
完整代码如下:
```python
import pandas as pd
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 读取CSV文件
df = pd.read_csv('新生数据.csv', encoding='GBK')
# 统计各省男女人数
province_data = {}
for i in range(len(df)):
row = df.iloc[i]
province = row['省']
sex = row['性别']
if province not in province_data:
province_data[province] = {'男': 0, '女': 0}
if sex == '男':
province_data[province]['男'] += 1
else:
province_data[province]['女'] += 1
# 转化为堆叠柱形图需要的数据格式
data = {'province': [], 'male': [], 'female': []}
for province in province_data:
data['province'].append(province)
data['male'].append(province_data[province]['男'])
data['female'].append(province_data[province]['女'])
# 绘制堆叠柱形图
fig, ax = plt.subplots()
ax.bar(data['province'], data['male'], label='男')
ax.bar(data['province'], data['female'], bottom=data['male'], label='女')
ax.set_xlabel('省份')
ax.set_ylabel('人数')
ax.legend()
plt.show()
```