如何在 Python 中创建一个带有左右两个独立纵坐标的图表?
时间: 2024-11-16 17:11:29 浏览: 14
在Python中,可以使用matplotlib库创建带有多组独立纵坐标轴的图表,例如双y轴图表。下面是一个简单的例子:
```python
import matplotlib.pyplot as plt
# 创建数据
data1 = [1, 2, 3, 4]
data2 = [5, 6, 7, 8]
fig, ax1 = plt.subplots() # 创建主图
ax1.set_ylabel('Main Y-axis') # 设置主轴标签
# 第二条y轴
ax2 = ax1.twinx() # 使用twinx函数在同一x轴上添加第二个y轴
ax2.set_ylabel('Secondary Y-axis') # 设置副轴标签
# 分别绘制两条线到各自的y轴
ax1.plot(data1)
ax2.plot(data2)
# 显示图表标题和调整轴范围
plt.title('Two independent y-axes')
ax1.set_ylim(0, 10) # 主轴范围
ax2.set_ylim(5, 15) # 副轴范围
# 显示图表
plt.show()
```
相关问题
python编程根据‘新生数据.xls’,分别绘制: 男生身高分布直方图和拟合曲线; 女生身高分布直方图和拟合曲线; 各省男女身高柱形图(横坐标为各省,纵坐标为身高); 各省男女人数堆叠柱形图(横坐标为各省,纵坐标为人数) 要求: 创建带有2行2列子图的窗口以显示上述4图,合理布局图大小。
由于本题需要读取Excel文件和绘制多张图表,建议使用pandas和matplotlib库来完成。
以下是代码实现:
```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 读取Excel数据
df = pd.read_excel('新生数据.xlsx')
# 绘制男生身高分布直方图和拟合曲线
male_df = df[df['性别'] == '男']
sns.displot(data=male_df, x='身高', kde=True)
plt.title('Male Height Distribution')
plt.xlabel('Height (cm)')
plt.ylabel('Count')
# 绘制女生身高分布直方图和拟合曲线
female_df = df[df['性别'] == '女']
sns.displot(data=female_df, x='身高', kde=True)
plt.title('Female Height Distribution')
plt.xlabel('Height (cm)')
plt.ylabel('Count')
# 绘制各省男女身高柱形图
province_df = df.groupby(['省份', '性别'])['身高'].mean().unstack()
province_df.plot(kind='bar')
plt.title('Average Height by Province')
plt.xlabel('Province')
plt.ylabel('Height (cm)')
# 绘制各省男女人数堆叠柱形图
count_df = df.groupby(['省份', '性别'])['身高'].count().unstack()
count_df.plot(kind='bar', stacked=True)
plt.title('Student Count by Province and Gender')
plt.xlabel('Province')
plt.ylabel('Count')
# 设置图表窗口布局
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(12, 8))
# 将前两张图表添加到第一行的子图区域中
axs[0][0].set_aspect('equal')
plt.sca(axs[0][0])
sns.displot(data=male_df, x='身高', kde=True)
plt.title('Male Height Distribution')
plt.xlabel('Height (cm)')
plt.ylabel('Count')
axs[0][1].set_aspect('equal')
plt.sca(axs[0][1])
sns.displot(data=female_df, x='身高', kde=True)
plt.title('Female Height Distribution')
plt.xlabel('Height (cm)')
plt.ylabel('Count')
# 将后两张图表添加到第二行的子图区域中
axs[1][0].set_aspect('equal')
plt.sca(axs[1][0])
province_df.plot(kind='bar')
plt.title('Average Height by Province')
plt.xlabel('Province')
plt.ylabel('Height (cm)')
axs[1][1].set_aspect('equal')
plt.sca(axs[1][1])
count_df.plot(kind='bar', stacked=True)
plt.title('Student Count by Province and Gender')
plt.xlabel('Province')
plt.ylabel('Count')
plt.tight_layout()
plt.show()
```
代码解析:
首先使用pandas库的`read_excel`函数读取Excel文件,得到一个DataFrame对象。
然后,使用seaborn库的`displot`函数分别绘制男生和女生的身高分布直方图,并设置显示拟合曲线。接下来,使用pandas库的`groupby`函数按照省份和性别对数据进行分组,并计算不同省份和性别的学生平均身高和人数。最后,使用matplotlib库的`plot`函数绘制各省男女身高和人数的柱形图。
为了显示多张图片,我们创建了一个`2x2`的子图的窗口,并将前两张图放在第一行的子图区域中,后两张图放在第二行的子图区域中。使用matplotlib库的`tight_layout`函数调整图表的布局。
最后,使用`show`函数显示图表。
阅读全文