努力是为了不平庸~
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰
目录
时间趋势可视化-柱形图
第1关:“大胃王”比赛数据柱形图绘制——绘制柱形图的基本步骤
任务描述
相关知识
观察和处理数据
绘制柱形图
编程要求
测试说明
第2关:“大胃王”比赛数据柱形图绘制——柱形图展示优化
任务描述
相关知识
对柱形图进行美化
将柱形图保存为 PDF 文件或 png 文件
编程要求
测试说明
时间趋势可视化-柱形图
第1关:“大胃王”比赛数据柱形图绘制——绘制柱形图的基本步骤
任务描述
本关任务:根据实训提供的“大胃王”比赛数据绘制柱形图,熟悉柱形图绘制的基本步骤。
相关知识
为了完成本关任务,你需要掌握:
- 观察和处理数据;
- 绘制柱形图的基本步骤。
观察和处理数据
先导入
matplotlib
和pandas
,用pandas
中的read_csv()
方法读取 csv 格式文件。
import pandas as pd #导入pandas,用于生成满足绘图要求的数据格式
from matplotlib import pyplot as plt #导入matplotlib,用于绘制柱形图
from matplotlib.backends.backend_pdf import PdfPages #用于将图片保存成pdf
hot_dog = pd.read_csv(r"matplotlib_bar/csv/hot-dog-contest-winners.csv") #返回值为二维标记数据结构DataFrame
hot_dog.head() #返回前五行数据
让我们先看看数据文件的前5行内容:
Year Winner Dogs eaten Country New record 1980 Paul Siederman & Joe Baldini 9.1 United States 0 1981 Thomas DeBerry 9.1 United States 0 1982 Steven Abrams 11.0 United States 0 1983 Luis Llamas 19.5 Mexico 0 1984 Birgit Felden 9.5 Germany 0 这个数据展示的是自1980年开始,每年吃热狗大赛的冠军姓名,冠军吃掉热狗的数量,冠军的国籍,以及是否打破纪录(0表示没有破纪录,1表示破纪录)。
绘制柱形图
首先简单介绍一下绘制柱形图的 bar 函数:
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)[source]
参数:
- x:x 坐标,数据类型
int
,float
- height:柱形高度,数据类型
int
,float
- width:柱形宽度,默认
0.8
,范围0 - 1
之间- bottom:条形的起始位置,也是 y 轴的起始坐标
- align:条形的中心位置,
center
,edge
边缘- color:条形的颜色,
r
,b
,g
,#123465
等,默认b
- edgecolor:边框的颜色,同上
- linewidth:边框的宽度,默认无,
int
类型- tick_label:下标的标签,可以是元组类型的字符组合
- log:y 轴使用科学计算法表示,
bool
类型- orientation:是竖直条还是水平条,竖直:
vertical
,水平条:horizontal
其中,最基本和最常用的是
x
,height
,width
和color
四个参数。 接下来让我们开始画一张不同年份冠军吃掉热狗数量的柱形图。
fig, ax = plt.subplots() #subplots返回画布和子图
axis.bar(hot_dog["Year"],hot_dog["Dogs eaten"]) #绘制柱形图,第一个参数为x轴变量,第二个参数为y轴变量
plt.show() #显示图像
此时生成的图像如下图1所示:
图1 默认生成的柱形图
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,绘制一张不同年份冠军吃掉热狗数量的柱形图。
测试说明
平台会对你编写的代码进行测试,如果你的图形与正确答案图形一致,则通关。
# -*- coding: utf-8 -*-
import pandas as pd
from matplotlib import pyplot as plt
hot_dog = pd.read_csv(r"matplotlib_bar/csv/hot-dog-contest-winners.csv")
def plot():
# ********* Begin *********#
fig, ax = plt.subplots() #subplots返回画布和子图
ax.bar(hot_dog["Year"],hot_dog["Dogs eaten"]) #绘制柱形图,第一个参数为x轴变量,第二个参数为y轴变量
plt.show() #显示图像
# ********* End *********#
plt.savefig('matplotlib_bar/studentfile/studentanswer/level_1/US.png')
plt.close()
第2关:“大胃王”比赛数据柱形图绘制——柱形图展示优化
任务描述
本关任务:根据实训提供的“大胃王”比赛数据绘制柱形图,并存为 PDF 或 png 文件。
相关知识
为了完成本关任务,你需要掌握:
- 对柱形图进行美化;
- 将柱形图保存为 PDF 文件或 png 文件。
对柱形图进行美化
关卡1中的柱形图看起来平平无奇,打破记录的年份这一信息也没有体现,如果我们需要突出打破记录的年份呢?如何用不同的颜色进行表示?此外,系统默认的颜色饱和度很高,能选择更赏心悦目的颜色吗?当然可以!
突出破纪录的年份 在关卡1的基础上,这一步我们可以写一个函数,根据年份是否打破纪录,赋予不同的颜色,然后把各个年份应显示的颜色放入一个列表中。
def newRecordColor():
"打破记录的年份显示为粉红色,其余年份为灰绿色"
list=[]
for i in hot_dog["New record"]:
if i==1:
list.append("#DB7093") #打破记录的年份显示为粉红色
else:
list.append("#5F9F9F") #其余年份显示为灰绿色
return list
别忘了将代码
axis.bar(hot_dog["Year"],hot_dog["Dogs eaten"])
修改为
ax.bar(hot_dog["Year"],hot_dog["Dogs eaten"],color=newRecordColor()) #添加指定的颜色
光秃秃的柱形图并不能让别人快速理解数据的含义,因此,我们应当为柱形图添加必要的文字说明:
ax.set_xlabel("Year") #设置x轴标签
ax.set_ylabel("Dogs Eaten") #设置y轴标签
ax.set_title("Hotdog game scores 1980-2010") #设置标题
ax.set_xlim(1979,2011) #设置x轴数据限值
此时生成的图像如下图1所示:
图1 突出打破纪录年份后的柱形图
调整柱子的间距 图1看起来还不错,只是柱子之间太拥挤了,可以修改宽度,将代码:
ax.bar(hot_dog["Year"],hot_dog["Dogs eaten"],color=newRecordColor())
修改为
ax.bar(hot_dog["Year"],hot_dog["Dogs eaten"],width=[0.6],color=newRecordColor()) #添加指定的宽度
然后修改画布的尺寸,添加代码:
plt.rcParams['figure.figsize'] = (8.0, 4.0) #设置figure_size尺寸
此时生成的图像如下图2如所示:
图2 美化后的柱形图
将柱形图保存为 PDF 文件或 png 文件
如果后续想要用 Illustrator 对图片进行美化,可以将图片保存为 PDF 格式,添加代码:
pdf =PdfPages('matplotlib_bar/studentfile/studentanswer/level_2/hotdog.pdf') #设置pdf保存的路径和文件名
pdf.savefig(fig) #将画布内容保存为PDF
plt.close() #关闭画布窗口
pdf.close() #关闭PDF文件
如果想将图片保存为 png 格式文件,则添加代码:
plt.savefig('matplotlib_bar/studentfile/studentanswer/level_2/hotdog.png') #保存png文件
plt.close() #关闭画布窗口
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,绘制柱形图,并突出美国人获胜的年份。其中美国人获胜的年份显示为粉红色(
#DB7093
),其余年份显示为灰绿色(#5F9F9F
),画布大小等设置与上文保持一致。测试说明
平台会对你编写的代码进行测试,如果你的图形与正确答案图形一致,则通关。 图片预期输出示例:
开始你的任务吧,祝你成功!
# -*- coding: utf-8 -*-
import pandas as pd
from matplotlib import pyplot as plt
hot_dog = pd.read_csv(r"matplotlib_bar/csv/hot-dog-contest-winners.csv")
def plot():
# ********* Begin *********#
fig, ax = plt.subplots() #subplots返回画布和子图
ax.bar(hot_dog["Year"],hot_dog["Dogs eaten"],width=[0.6],color=unitedStatesColor()) #添加指定的宽度
ax.set_xlabel("Year") #设置x轴标签
ax.set_ylabel("Dogs Eaten") #设置y轴标签
ax.set_title("Hotdog game scores 1980-2010") #设置标题
ax.set_xlim(1979,2011) #设置x轴数据限值
plt.rcParams['figure.figsize'] = (8.0, 4.0) #设置figure_size尺寸
# ********* End *********#
plt.savefig('matplotlib_bar/studentfile/studentanswer/level_2/US.png')
plt.close()
def unitedStatesColor():
# ********* Begin *********#
list=[]
for i in hot_dog["Country"]:
if i=='United States':
list.append("#DB7093") #打破记录的年份显示为粉红色
else:
list.append("#5F9F9F") #其余年份显示为灰绿色
return list
# ********* End *********#