https://datawhalechina.github.io/pms50/#/chapter6/chapter6
邊緣直方圖 (Marginal Histogram)
邊緣直方圖具有沿 X 和 Y 軸變量的直方圖。 這用於可視化 X 和 Y 之間的關系以及單獨的 X 和 Y 的單變量分布。 這種圖經常用於探索性數據分析(EDA)。
導入所需要的庫
# 導入numpy庫 import numpy as np # 導入pandas庫 import pandas as pd # 導入matplotlib庫 import matplotlib as mpl import matplotlib.pyplot as plt # 導入seaborn庫 import seaborn as sns # 在jupyter notebook顯示圖像 %matplotlib inline
設定圖像各種屬性
large = 22; med = 16; small = 12 # 設置子圖上的標題字體 params = {'axes.titlesize': large, # 設置圖例的字體 'legend.fontsize': med, # 設置圖像的畫布 'figure.figsize': (16, 10), # 設置標簽的字體 'axes.labelsize': med, # 設置x軸上的標尺的字體 'xtick.labelsize': med, # 設置整個畫布的標題字體 '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://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")
# step2:創建子圖對象與網格
# 畫布 fig = plt.figure(figsize = (16, 10), # 畫布大小_(16, 10) dpi = 80, # 分辨率 facecolor = 'white') # 背景顏色,默認為白色 # 網格 grid = plt.GridSpec(4, # 行數 4, # 列數 hspace = 0.5, # 行與行之間的間隔 wspace = 0.2) # 列與列之間的間隔
# step3:明確子圖的位置
# 確定如圖所示散點圖的位置 ax_main = fig.add_subplot(grid[:-1, :-1]) # 確定如圖所示右邊直方圖的位置 ax_right = fig.add_subplot(grid[:-1, -1], xticklabels = [], yticklabels = []) # 確定如圖所示最底下直方圖的位置 ax_bottom = fig.add_subplot(grid[-1, 0:-1], xticklabels = [], yticklabels = [])
# step4:散點圖
# category__Category是pandas的一種數據類型 # astype__實現變量類型轉換 # cat__獲取分類變量的類別 # codes__按照類別編碼 ax_main.scatter('displ', # 橫坐標 'hwy', # 縱坐標 s = df.cty*4, # 設置點的尺寸 data = df, # 所使用的數據 c = df.manufacturer.astype('category').cat.codes, # 顏色類別 cmap = 'tab10', # 調色板 edgecolors = 'gray', # 邊框顏色 linewidths = 0.5, # 線寬 alpha = 0.9) # 透明度
# step5:右邊的直方圖
ax_right.hist(df.hwy, # 需要繪圖的變量 40, # 需要分為多少段 histtype = 'stepfilled', # 生成一個的線條輪廓 orientation = 'horizontal', # 方位__水平 color = 'deeppink') # 顏色__深粉色
# step6:底部的直方圖
ax_bottom.hist(df.displ, # 需要繪圖的變量 40, # 需要分為多少段 histtype = 'stepfilled', # 生成一個的線條輪廓 orientation = 'vertical', # 方位__垂直 color = 'deeppink') # 顏色__深粉色 ax_bottom.invert_yaxis()
# step7:裝飾圖像
ax_main.set(title='Scatterplot with Histograms \n displ vs hwy', # 設置標題 xlabel='displ', # 橫坐標名稱 ylabel='hwy') # 縱坐標名稱 ax_main.title.set_fontsize(20) # 設置標題字體大小 # xaxis.label__x坐標軸的標題 # yaxis.label__y坐標軸的標題 # xticklabel__x坐標軸的標尺 # yticklabel__y坐標軸的標尺 # 遍歷每一個對象並且修改其字體大小 for item in ([ax_main.xaxis.label, ax_main.yaxis.label] + ax_main.get_xticklabels() + ax_main.get_yticklabels()): item.set_fontsize(14) # 修改字體大小 xlabels = ax_main.get_xticks().tolist() # 將散點圖上的x坐標軸上的標尺提取后轉換為list(一位小數) ax_main.set_xticklabels(xlabels) # 將xlabels中的數字設置為散點圖上的坐標軸上的標尺 plt.show() # 顯示圖像
博文總結
matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid',
log=False, color=None, label=None, stacked=False, normed=None)
關鍵參數
x: 數據集,最終的直方圖將對數據集進行統計 bins: 統計的區間分布 range: tuple, 顯示的區間,range在沒有給出bins時生效 density: bool,默認為false,顯示的是頻數統計結果,為True則顯示頻率統計結果,這里需要注意,頻率統計結果=區間數目/(總數*區間寬度),和normed效果一致,官方推薦使用density histtype: 可選{'bar', 'barstacked', 'step', 'stepfilled'}之一,默認為bar,推薦使用默認配置,step使用的是梯狀,stepfilled則會對梯狀內部進行填充,效果與bar類似 align: 可選{'left', 'mid', 'right'}之一,默認為'mid',控制柱狀圖的水平分布,left或者right,會有部分空白區域,推薦使用默認 log: bool,默認False,即y坐標軸是否選擇指數刻度 stacked: bool,默認為False,是否為堆積狀圖