文章目录
一、条形图
条形图的绘制方式跟折线图非常的类似,只不过是换成了plt.bar
方法。plt.bar
方法有以下常用参数:
x
:一个数组或者列表,代表需要绘制的条形图的x轴的坐标点。height
:一个数组或者列表,代表需要绘制的条形图y轴的坐标点。width
:每一个条形图的宽度,默认是0.8的宽度。bottom
:y轴的基线,默认是0,也就是距离底部为0.align
:对齐方式,默认是center
,也就是跟指定的x坐标居中对齐,还有为edge
,靠边对齐,具体靠右边还是靠左边,看width
的正负。color
:条形图的颜色。
返回值为BarContainer
,是一个存储了条形图的容器,而条形图实际上的类型是matplotlib.patches.Rectangle
对象。
更多参考:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html#matplotlib.pyplot.bar
1.1 条形图的绘制
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib import font_manager
font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
#票房单位亿元
movies = {
"流浪地球":40.78,
"飞驰人生":15.77,
"疯狂的外星人":20.83,
"新喜剧之王":6.10,
"廉政风云":1.10,
"神探蒲松龄":1.49,
"小猪佩奇过大年":1.22,
"熊出没·原始时代":6.71
}
plt.figure(figsize=(15,5))
plt.bar(np.arange(len(movies)),list(movies.values()),width=0.5)
plt.xticks(np.arange(len(movies)),list(movies.keys()),fontproperties=font)
plt.yticks(np.arange(0,45,5),[f'{
v}亿'for v in range(0,45,5)],fontproperties=font)
plt.grid()
plt.show()
1.2 横向条形图的绘制
横向条形图需要使用 plt.barh
这个方法跟 bar
非常的类似,只不过把方向进行旋转。参数跟bar类似,但也有区别。如下:
y
:数组或列表,代表需要绘制的条形图在y
轴上的坐标点。width
:数组或列表,代表需要绘制的条形图在x轴上的值(也就是长度)。height
:条形图的高度,默认是0.8。left
:条形图的基线,也就是距离y轴的距离。
其他参数跟bar
一样。
返回值也是BarContainer
容器对象
movies = {
"流浪地球":40.78,
"飞驰人生":15.77,
"疯狂的外星人":20.83,
"新喜剧之王":6.10,
"廉政风云":1.10,
"神探蒲松龄":1.49,
"小猪佩奇过大年":1.22,
"熊出没·原始时代":6.71
}
plt.barh(np.arange(len(movies)),list(movies.values()))
plt.xticks(np.arange(0,45,5),[f'{
v}亿' for v in range(0,45,5)],fontproperties=font)
plt.yticks(np.arange(len(movies)),list(movies.keys()),fontproperties=font)
plt.grid()
plt.show()
1.3 分组条形图
matplotlib没有直接实现分组条形图的方法,需要借用plt.bar来实现
# 现在有一组数据,是2019年春节贺岁片前五天的电影票房记录。
# 示例代码如下:
movies = {
"流浪地球":[2.01,4.59,7.99,11.83,16],
"飞驰人生":[3.19,5.08,6.73,8.10,9.35],
"疯狂的外星人":[4.07,6.92,9.30,11.29,13.03],
"新喜剧之王":[2.72,3.79,4.45,4.83,5.11],
"廉政风云":[0.56,0.74,0.83,0.88,0.92],
"神探蒲松龄":[0.66,0.95,1.10,1.17,1.23],
"小猪佩奇过大年":[0.58,0.81,0.94,1.01,1.07],
"熊出没·原始时代":[1.13,1.96,2.73,3.42,4.05]
}
# 构建DataFrame数据
movie_pd = pd.DataFrame(movies)
print(movie_pd)
流浪地球 飞驰人生 疯狂的外星人 新喜剧之王 廉政风云 神探蒲松龄 小猪佩奇过大年 熊出没·原始时代
0 2.01 3.19 4.07 2.72 0.56 0.66 0.58 1.13
1 4.59 5.08 6.92 3.79 0.74 0.95 0.81 1.96
2 7.99 6.73 9.30 4.45 0.83 1.10 0.94 2.73
3 11.83 8.10 11.29 4.83 0.88 1.17 1.01 3.42
4 16.00 9.35 13.03 5.11 0.92 1.23 1.07 4.05
# 第一种方案
# first_day = movie_pd.iloc[0]
# plt.bar(ind-bin_width*2,first_day,width=bin_width,label='第一天')
# second_day = movie_pd.iloc[1]
# plt.bar(ind-bin_width,second_day,width=bin_width,label='第二天')
# third_day = movie_pd.iloc[2]
# plt.bar(ind,third_day,width=bin_width,label='第三天')
# four_day = movie_pd.iloc[3]
# plt.bar(ind+bin_width,four_day,width=bin_width,label='第四天')
# five_day = movie_pd.iloc[4]
# plt.bar(ind+bin_width*2,five_day,width=bin_width,label='第五天')
plt.figure(figsize=(20,8))
width = 0.8
bin_width = width/len(movie_pd.index)
ind = np.arange(0,len(movies))
# 第二种方案
for index in movie_pd.index:
day_tickets = movie_pd.iloc[index]
xs = ind-(bin_width*(len(movie_pd.index)//2-index))
plt.bar(xs,day_tickets,width=bin_width,label="第%d天"%(index+1))
for ticket,x in zip(day_tickets,xs):
plt.annotate(ticket,xy=(x,ticket),xytext=(x-0.1,tick