數據可視化的一個重要方法就是柱形圖,在excel中的柱形圖是非常簡單的,給一組數據就可以做出一個簡單的柱形圖,但是不知道你是不是和我一樣,每次想做一個漂亮的圖的時候總是被excel所限制,比如,橫座標軸顯示不完整,線型沒辦法選擇,字號,透明度,柱形圖的寬度等,今天我們利用matplotlib就可以做出一個簡單的柱形圖
本文編程語言:python
IDE:Jupyter notebook
所需庫:pandas、numpy、matplotlib、seaborn
想要實際操作你還需要點pandas的基礎知識
實例:
導入需要的庫:
import pandas as pd import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns import warnings; warnings.filterwarnings(action='once') import tkinter as tk from tkinter import filedialog from tkinter.filedialog import askdirectory import datetime as dt %matplotlib inline plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
導入處理的數據:
hot_dog=pd.read_csv(r"http://datasets.flowingdata.com/hot-dog-contest-winners.csv") hot_dog
採用最普通的畫法,畫一個簡單的柱形圖:
plt.figure(figsize=(15,7)) plt.bar(hot_dog["Year"],hot_dog["Dogs eaten"])
這樣優點太過單調了,我們稍微美化一下:
plt.figure(figsize=(25,9)) plt.bar(hot_dog["Year"],hot_dog["Dogs eaten"],label="熱狗數量") plt.ylabel('被吃掉的熱狗數量',fontsize=17) plt.xlabel('時間',fontsize=17) plt.xticks(hot_dog["Year"],fontsize=15,color="k",alpha=.8) plt.title("變化每年被吃掉的熱狗數量變化圖",bbox=dict(facecolor='gold', edgecolor='blue', alpha=0.1),fontsize=23) plt.grid(color='g', linestyle='-', linewidth=1,alpha=.2) plt.legend(loc="upper left",fontsize=16) for a,b in zip(hot_dog["Year"],hot_dog["Dogs eaten"]): plt.text(x=a-.25,y=b+1,s=b,color="crimson",fontsize=14) plt.show
過程解釋:
創建一個25*9英寸的畫布
plt.figure(figsize=(25,9))
畫柱形圖
plt.bar(hot_dog["Year"],hot_dog["Dogs eaten"],label="熱狗數量")
設置x,y座標軸名稱:
plt.ylabel('被吃掉的熱狗數量',fontsize=17)
plt.xlabel('時間',fontsize=17)
修改x軸的刻度標籤:設置字體顏色,大小透明度
plt.xticks(hot_dog["Year"],fontsize=15,color="k",alpha=.8)
設置標題:大小,顏色,邊框,字號等
plt.title("變化每年被吃掉的熱狗數量變化圖",bbox=dict(facecolor='gold', edgecolor='blue', alpha=0.1),fontsize=23)
設置網格線:可以設置顏色線型,線寬,透明度等
plt.grid(color='g', linestyle='-', linewidth=1,alpha=.2)
設置圖例:loc設置位置
plt.legend(loc="upper left",fontsize=16)
設置數據標籤:利用text,根據座標的位置來標記
for a,b in zip(hot_dog["Year"],hot_dog["Dogs eaten"]):
plt.text(x=a-.25,y=b+1,s=b,color="crimson",fontsize=14)
我還有另外一種更漂亮的畫法:利用vlines
plt.figure(figsize=(25,7)) plt.vlines(x=hot_dog["Year"], ymin=0, ymax=hot_dog["Dogs eaten"], color='firebrick', alpha=0.7, linewidth=3,label="熱狗數量") plt.scatter(x=hot_dog["Year"], y=hot_dog["Dogs eaten"]+.7, s=60, color="g", alpha=0.5) plt.ylabel('被吃掉的熱狗數量',fontsize=17) plt.xlabel('時間',fontsize=17) plt.xticks(hot_dog["Year"],fontsize=15,color="r",alpha=.73) plt.title("變化每年被吃掉的熱狗數量變化圖",bbox=dict(facecolor='gold', edgecolor='blue', alpha=0.1),fontsize=23) plt.grid(color='g', linestyle='-', linewidth=1,alpha=.2) plt.legend(loc="upper left",fontsize=16) for a,b in zip(hot_dog["Year"],hot_dog["Dogs eaten"]): plt.text(x=a-.25,y=b+2,s=b,color="crimson",fontsize=14) plt.show
是不是很簡單:
matplotlib中的柱形圖參數詳解:
普通畫法:matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)[source]
x:標量序列
height:柱形的高度
width=0.8:柱形的寬度,可選參數,默認為0.8
bottom:標量或類似數組,可選,條形基座的y座標(默認值:0),默認我們不設置,如果是疊加的柱形圖,需要重新設置
align:{'center','edge'},可選,默認:'center' 條形對齊x座標:
- 'center':將基準置於x位置的中心位置。
- 'edge':將條的左邊緣與x位置對齊。
其他參數:
color : 標量或類似數組,可選,顏色
edgecolor:標量或類似數組,可選,條形圖邊框的顏色
linewidth:標量或類似數組,可選,條形邊緣的寬度。 如果為0,則不繪製邊。
tick_label:字符串或類似數組,可選,刻度標籤。 默認值:無(使用默認數字標籤。)
可選參數color,edgecolor,linewidth,xerr和yerr可以是標量或長度等於條數的序列。 這使您可以使用條形作為堆積條形圖或燭臺圖的基礎。 細節:xerr和yerr直接傳遞給errorbar(),因此它們也可以具有形狀2xN,用於獨立指定低位和高位錯誤。