努力是為了不平庸~
學習的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾
目錄
時間趨勢可視化-柱形圖
第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 plthot_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 plthot_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 *********#
?