内容目录
竖向条形图¶
plt.bar函数的说明¶
def plt.bar(x, height, width=0.8, bottom=None, align='center', data=None, **kwargs):
"""
绘制条形图
参数:
x (array-like): 条形的x坐标
height (array-like): 条形的高度
width (float): 条形的宽度,默认为0.8
bottom (scalar or array-like): 条形的底部位置,默认为None
align (str): 条形的对齐方式,可选值为{'center', 'edge'}, 默认为'center'
data (DataFrame): 数据源,默认为None
**kwargs: 其他关键字参数,用于传递给matplotlib.pyplot.bar函数
返回:
container: 条形图的容器对象
"""
更为详细的plt.bar说明可以见官方文档:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.bar.html#pandas.DataFrame.plot.bar
In [15]:
import matplotlib.pyplot as plt
import numpy as np
# 数据准备
categories = ['A', 'B', 'C', 'D', 'E']
values = [25, 30, 35, 40, 45]
# 创建竖向条形图
plt.figure(figsize=(8, 6))
plt.bar(categories, values, color='skyblue')
plt.rcParams['font.sans-serif'] = ['PingFang HK']
# 添加标签和标题
plt.xlabel('分类')
plt.ylabel('取值')
plt.title('竖向条形图')
# 显示数值标签
for i, value in enumerate(values):
plt.text(i, value + 1, str(value), ha='center', va='bottom')
# 显示图形
plt.show()
横向条形图¶
plt.barh函数说明¶
def plt.barh(y, width, height=0.8, left=None, align='center', data=None, **kwargs):
"""
绘制横向条形图
参数:
y (array-like): 条形的y坐标
width (array-like): 条形的宽度
height (float): 条形的高度,默认为0.8
left (scalar or array-like): 条形的左侧位置,默认为None
align (str): 条形的对齐方式,可选值为{'center', 'edge'}, 默认为'center'
data (DataFrame): 数据源,默认为None
**kwargs: 其他关键字参数,用于传递给matplotlib.pyplot.barh函数
返回:
container: 条形图的容器对象
"""
更为详细的函数说明可以见官方文档https://matplotlib.org/3.8.4/api/_as_gen/matplotlib.pyplot.barh.html#matplotlib.pyplot.barh
In [2]:
import matplotlib.pyplot as plt
import numpy as np
# 数据准备
categories = ['A', 'B', 'C', 'D', 'E']
values = [25, 30, 35, 40, 45]
# 创建横向条形图
plt.figure(figsize=(8, 6))
plt.barh(categories, values, color='lightcoral')
# 添加标签和标题
plt.xlabel('数值')
plt.ylabel('分类')
plt.title('横向条形图')
# 显示数值标签
for i, value in enumerate(values):
plt.text(value + 1, i, str(value), ha='left', va='center')
# 显示图形
plt.show()
分组条形图¶
In [17]:
import matplotlib.pyplot as plt
import numpy as np
# 数据准备
ages = ['18-25', '26-35', '36-45', '46-55', '56+']
male_heights = [175, 178, 180, 176, 172]
female_heights = [162, 165, 168, 164, 160]
# 设置每组条形的宽度
bar_width = 0.35
index = np.arange(len(ages))
plt.rcParams['font.sans-serif'] = ['PingFang HK']
# 创建分组条形图
plt.figure(figsize=(10, 6))
plt.ylim(0, 220) # 设置y轴范围为0到220
plt.bar(index, male_heights, bar_width, label='男性', color='skyblue')
plt.bar(index + bar_width, female_heights, bar_width, label='女性', color='lightcoral')
# 添加标签和标题
plt.xlabel('年龄分组')
plt.ylabel('平均身高(单位:cm)')
plt.title('男女平均身高(按照年龄)')
plt.xticks(index + bar_width / 2, ages)
plt.legend()
# 显示数值标签
for i in index:
plt.text(i, male_heights[i] + 1, str(male_heights[i]), ha='center', va='bottom')
plt.text(i + bar_width, female_heights[i] + 1, str(female_heights[i]), ha='center', va='bottom')
# 显示图形
plt.show()
In [27]:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 创建DataFrame存储电影票房数据
data = {
'电影名称': ['流浪地球', '复仇者联盟', '风声', '飞驰人生', '疯狂外星人', '熊出没'],
'第一天票房': [4.5, 6.0, 4.5, 7.0, 5.5, 8.0],
'第二天票房': [5.5, 6.5, 4.8, 7.2, 5.8, 8.2],
'第三天票房': [5.2, 6.2, 4.7, 7.1, 5.6, 8.1],
'第四天票房': [5.3, 6.3, 4.6, 7.3, 5.7, 8.3],
'第五天票房': [5.4, 6.4, 4.4, 7.4, 5.9, 8.4],
'第六天票房': [5.1, 6.1, 4.3, 7.2, 5.6, 8.2],
'第七天票房': [5.2, 6.2, 4.2, 7.1, 5.5, 8.1]
}
df = pd.DataFrame(data)
movies = df['电影名称']
days = ['第一天票房', '第二天票房', '第三天票房', '第四天票房', '第五天票房', '第六天票房', '第七天票房']
# 设置每组条形的宽度
bar_width = 0.1
index = np.arange(len(movies))
# 创建分组条形图
plt.figure(figsize=(12, 8))
for i, day in enumerate(days):
plt.bar(index + bar_width*(i-3), df[day], bar_width, label=day)
# 加入柱状图的数据值
for j in range(len(movies)):
plt.annotate(str(df[day][j]), xy=(index[j] + bar_width*(i-3), df[day][j]), ha='center', va='bottom')
plt.xlabel('电影')
plt.ylabel('票房 (亿元)')
plt.title('过去七天6部上映电影的票房')
plt.xticks(index + bar_width / 2 - bar_width*3/2, movies)
plt.legend()
# 显示网格
plt.grid(True)
# 显示图形
plt.show()
注意事项:
- 1、分组条形图没有专门的函数直接生成分组条形图,需要自己来实现每个条形图的显示。
- 2、每个条形图在显示的时候,通过条形图的宽度来计算每个条形图的位置;因为每个数据有中线位置,所以以中线位置向左减去bar_width或者向右加上bar_width来显示。
- 3、为了简化代码,可以通过循环的方式绘制每个条形图的显示plt.bar(index + bar_width*(i-3), df[day], bar_width, label=day)
堆叠条形图¶
In [14]:
import matplotlib.pyplot as plt
# 数据准备
age_groups = ['18-25', '26-35', '36-45', '46-55', '56+']
male_population = [200, 300, 350, 400, 450]
female_population = [150, 250, 300, 350, 400]
plt.rcParams['font.sans-serif'] = ['PingFang HK']
# 创建堆叠条形图
plt.figure(figsize=(10, 6))
plt.bar(age_groups, male_population, label='男性', color='skyblue')
plt.bar(age_groups, female_population, bottom=male_population, label='女性', color='lightcoral')
# 添加标签和标题
plt.xlabel('年龄分组')
plt.ylabel('人口数量(单位:万人)')
plt.title('男女人口数量分布(按照年龄)')
plt.legend()
# 显示数值标签
for i in range(len(age_groups)):
plt.text(i, male_population[i] + female_population[i] + 10, str(male_population[i]), ha='center')
plt.text(i, male_population[i] / 2, str(female_population[i]), ha='center')
# 显示图形
plt.show()