偏差 (Deviation)
帶標記的發散型棒棒糖圖 (Diverging Lollipop Chart with Markers)
帶標記的棒棒糖圖通過強調您想要引起注意的任何重要數據點並在圖表中適當地給出推理,提供了一種對差異進行可視化的靈活方式。
https://datawhalechina.github.io/pms50/#/chapter13/chapter13
導入所需要的庫
import numpy as np # 導入numpy庫 import pandas as pd # 導入pandas庫 import matplotlib as mpl # 導入matplotlib庫 import matplotlib.pyplot as plt import seaborn as sns # 導入seaborn庫
設定圖像各種屬性
large = 22; med = 16; small = 12 params = {'axes.titlesize': large, # 設置子圖上的標題字體 'legend.fontsize': med, # 設置圖例的字體 'figure.figsize': (16, 10), # 設置圖像的畫布 'axes.labelsize': med, # 設置標簽的字體 'xtick.labelsize': med, # 設置x軸上的標尺的字體 'ytick.labelsize': med, # 設置整個畫布的標題字體 'figure.titlesize': large} plt.rcParams.update(params) # 更新默認屬性 plt.style.use('seaborn-whitegrid') # 設定整體風格 sns.set_style("white") # 設定整體背景風格
程序代碼
# step1:導入數據
df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mtcars.csv") x = df.loc[:, ['mpg']] df['mpg_z'] = (x - x.mean()) / x.std() df['colors'] = 'black'
# step2:改變fiat這一款車的顏色
df.loc[df.cars == 'Fiat X1-9', 'colors'] = 'darkorange' df.sort_values('mpg_z', inplace = True) df.reset_index(inplace = True)
# step3 繪制帶標記的發散型棒棒糖圖
# 畫布 plt.figure(figsize = (14, 16), dpi = 80) # 條形圖 plt.hlines(df.index, # 將y下標作為繪制直線的位置 xmin = 0, # 每一行的開頭 xmax = df.mpg_z, # 每一行的結尾 color = df.colors, alpha = 0.4, linewidth = 1) # 散點圖 plt.scatter(df.mpg_z, df.index, color = df.colors, s = [600 if x == 'Fiat X1-9' else 300 for x in df.cars], alpha = 0.6) # y軸坐標 plt.yticks(df.index, df.cars) # x軸坐標 plt.xticks(fontsize = 12)
# step4:添加注釋
plt.annotate('Mercedes Models', # 文本內容 xy = (0.0, 11.0), # 注釋的起始位置 xytext = (1.0, 11), # 文本的起始位置 xycoords = 'data', # xy坐標系 fontsize = 15, # 文本尺寸 ha = 'center', va = 'center', # 水平對齊,垂直對齊 bbox = dict(boxstyle = 'square', # 箱體的形態為方形 fc = 'firebrick'), # 箱體的顏色 arrowprops = dict(arrowstyle = '-[, widthB = 2.0, lengthB = 1.5', # 箭頭的類型,箭頭的長度,箭頭的寬度 lw = 2.0, # 箭頭的線寬 color = 'steelblue'), # 箭頭的顏色 color = 'white') # 文本的顏色
# step5:添加補丁
p1 = patches.Rectangle((-2.0, -1), # 補丁左下角的坐標 width = .3, # 補丁的寬度 height = 3, # 補丁的高度 alpha = .2, # 補丁的透明度 facecolor = 'red') # 補丁內部的顏色 p2 = patches.Rectangle((1.5, 27), # 補丁左下角的坐標 width = .8, # 補丁的寬度 height = 5, # 補丁的高度 alpha = .2, # 補丁的透明度 facecolor = 'green') # 補丁內部的顏色 plt.gca().add_patch(p1) # 獲取子圖,並且將補丁添加至子圖 plt.gca().add_patch(p2) # 獲取子圖,並且將補丁添加至子圖
# step6:添加裝飾
# 設置圖像標題 plt.title('Diverging Bars of Car Mileage', # 圖像標題名稱 fontdict={'size':20}) # 字體尺寸 # 設置網格線 plt.grid(linestyle='--', # 網格線類型 alpha=0.5) # 網格線透明度 plt.show() # 顯示圖像