Matplotlib 如何使用Matplotlib和Pandas来制作面部柱状图
在本文中,我们将介绍如何使用Matplotlib和Pandas来制作面部柱状图(faceting bar plots),这种数据可视化方式可以帮助我们更好地观察数据。面部柱状图形式上类似于热力图,但是它将大的柱状图分割成了多个小的柱状图,每个小柱状图代表着不同的子类别,这样我们就可以在相同面积的图表上同时展示子类别和总体情况,以便更好地发现它们之间的差异和联系。
阅读更多:Matplotlib 教程
1. Matplotlib绘制基本的柱状图
在绘制面部柱状图之前,我们需要先掌握Matplotlib绘制基本的柱状图。下面是一个例子,展示了一组关于学习成绩的数据:
import matplotlib.pyplot as plt
labels = ['Math', 'Science', 'History', 'Geography', 'English']
scores = [90, 85, 70, 60, 80]
plt.bar(labels, scores)
plt.title('Student Scores')
plt.xlabel('Subjects')
plt.ylabel('Scores')
plt.show()
上述代码中,我们首先定义了一个标签列表和一个成绩列表,然后使用plt.bar()
函数制作了一个柱状图。plt.title()
函数和plt.xlabel()
和plt.ylabel()
函数用于设置图表的标题、x轴和y轴标签。最后,我们使用plt.show()
函数将绘制出来的图表显示出来。
2. Pandas绘制基本的柱状图
除了使用Matplotlib绘制基本的柱状图外,我们还可以使用Pandas来绘制,并且可以更方便地控制图表的样式和细节。下面是一个使用Pandas绘制柱状图的例子:
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame({'Subject': ['Math', 'Science', 'History', 'Geography', 'English'],
'Score': [90, 85, 70, 60, 80]})
ax = data.plot.bar(x='Subject', y='Score', legend=False)
ax.set_title('Student Scores')
ax.set_xlabel('Subjects')
ax.set_ylabel('Scores')
plt.show()
与Matplotlib相比,Pandas为我们提供了一个plot()
函数来绘制数据,并且还可以直接通过函数参数控制图表的样式、标签和颜色等。
3. Pandas绘制面部柱状图
既然我们已经掌握了Pandas绘制基本的柱状图的方法,那么接下来就可以来制作面部柱状图了。下面是一个使用Pandas绘制面部柱状图的例子。
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame({'Subject': ['Math', 'Science', 'History', 'Geography', 'English'],
'Score': [90, 85, 70, 60, 80],
'Gender': ['Male', 'Male', 'Female', 'Female', 'Male']})
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
for gender, ax in zip(['Male', 'Female'], axs):
df = data.loc[data['Gender'] == gender]
ax.bar(df['Subject'], df['Score'])
ax.set_title(gender)
plt.suptitle('Student Scores by Gender')
plt.show()
上述代码中,我们首先定义了一个数据表,其中包含了学科、成绩和性别三个变量,然后我们使用plt.subplots()
函数创建了两个子图,并且通过zip()
函数将它们和Gender
列一一对应起来,最后在每个子图上绘制了相应性别下的面部柱状图。
4. 高级面部柱状图
除了基本的面部柱状图以外,我们还可以通过一些高级技巧来增强图表的表现力和信息量。下面是一些例子。
4.1 为子类别添加百分比
在面部柱状图中,通常我们需要同时展示子类别和总体情况。为了更好地反映每个子类别在总体中所占的比例,我们可以在每个子类别的柱状图上添加对应百分比。下面是一个相应的示例代码:
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame({'Subject': ['Math', 'Science', 'History', 'Geography', 'English'],
'Score': [90, 85, 70, 60, 80],
'Gender': ['Male', 'Male', 'Female', 'Female', 'Male']})
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
for gender, ax in zip(['Male', 'Female'], axs):
df = data.loc[data['Gender'] == gender]
ax.bar(df['Subject'], df['Score'])
ax.set_title(gender)
ax.set_ylim([0, 100])
for i, v in enumerate(df['Score']):
percentage = '{:.1f}%'.format(v / df['Score'].sum() * 100)
ax.text(i, v + 2, percentage, ha='center')
plt.suptitle('Student Scores by Gender')
plt.show()
上述代码中,我们在每个柱状图上使用了ax.text()
函数来添加每个子类别的百分比信息,其中i
表示柱状图的序号,v
表示柱状图的高度,percentage
表示对应的百分比。
4.2 使用颜色编码
在面部柱状图中,我们还可以使用颜色编码来反映不同子类别的特征。下面是一个相应的示例代码:
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame({'Subject': ['Math', 'Science', 'History', 'Geography', 'English'],
'Score': [90, 85, 70, 60, 80],
'Gender': ['Male', 'Male', 'Female', 'Female', 'Male'],
'Category': ['A', 'B', 'A', 'C', 'B']})
color_dict = {'A': 'r', 'B': 'g', 'C': 'b'}
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))
for gender, ax in zip(['Male', 'Female'], axs):
df = data.loc[data['Gender'] == gender]
ax.bar(df['Subject'], df['Score'], color=[color_dict[c] for c in df['Category']])
ax.set_title(gender)
plt.suptitle('Student Scores by Gender and Category')
plt.show()
上述代码中,我们使用了一个color_dict
字典来存储颜色编码信息,然后在绘图时使用color
参数来指定每个子类别的颜色。
总结
本文介绍了如何使用Matplotlib和Pandas来制作面部柱状图,包括基本的柱状图绘制、Pandas的柱状图绘制、面部柱状图的制作方法和一些高级技巧。面部柱状图作为一种常用的数据可视化方式,可以帮助我们更好地理解和发现数据的内在联系和差异。