Python-matplotlib 多子圖共用colorbar

2021-03-02 EasyShu

在推出散點顏色密度圖的matplotlib 繪製教程後,有小夥伴反應能否出一篇多子圖共用一個colorbar的系列教程,這裡也就使用自己的數據進行繪製(數據一共四列,具體為真實值和使用三個模型計算的預測值)。
在繪製多子圖共用colorbar時,最重要的就是對顏色映射進行設置,這裡使用了matplotlib.color.Normalize()進行顏色和數值對應設置。先看一下使用默認設置的結果,每個子圖對應一個colorbar。效果如下:

可以看出,每個子圖對應的值顏色都是不同,這樣不利於對比,採用matplotlib.color.Normalize()操作後就可有效解決此問題:
norm = matplotlib.colors.Normalize(vmin=0, vmax=60)

import pandas as pdimport numpy as npimport matplotlibimport matplotlib.cm as cmimport matplotlib.pyplot as pltplt.rcParams['font.family'] = ['Arial']
test_data = pd.read_excel('GBRT_SVR_DNN_esti_save_angle_process.xlsx')
x = test_data['true_data'].values.ravel() y = test_data['model01_estimated'].values.ravel()y2 = test_data['SVR_estimated'].values.ravel()y3 = test_data['DNN_model01_estimated'].values.ravel()
nbins = 150H, xedges, yedges = np.histogram2d(x, y, bins=nbins)H = np.rot90(H)H = np.flipud(H)Hmasked = np.ma.masked_where(H==0,H)
H2, xedges2, yedges2 = np.histogram2d(x, y2, bins=nbins)H2 = np.rot90(H2)H2 = np.flipud(H2)Hmasked2 = np.ma.masked_where(H2==0,H2)
H3, xedges3, yedges3 = np.histogram2d(x, y3, bins=nbins)H3 = np.rot90(H3)H3 = np.flipud(H3)Hmasked3 = np.ma.masked_where(H3==0,H3)
fig, (ax1, ax2,ax3) = plt.subplots(nrows=1,ncols=3,figsize=(12,3),dpi=200)
norm = matplotlib.colors.Normalize(vmin=0, vmax=60)
im1 = ax1.pcolormesh(xedges, yedges, Hmasked, cmap=cm.get_cmap('jet'),norm=norm)
im2 = ax2.pcolormesh(xedges2, yedges2, Hmasked2, cmap=cm.get_cmap('jet'), norm=norm)
im3 = ax3.pcolormesh(xedges3, yedges3, Hmasked3, cmap=cm.get_cmap('jet'), norm=norm,)
fig.subplots_adjust(right=0.9)position = fig.add_axes([0.92, 0.12, 0.015, .78 ])cb = fig.colorbar(im3, cax=position)
colorbarfontdict = {"size":15,"color":"k",'family':'Times New Roman'}cb.ax.set_title('Counts',fontdict=colorbarfontdict,pad=8)cb.ax.tick_params(labelsize=11,direction='in')cb.ax.set_yticklabels(['0','10','20','30','40','50','>60'],family='Times New Roman')fig.suptitle('One Colorbar for Multiple Plot ',size=20,family='Times New Roman',x=.5,y=1.05)plt.savefig(r'E:\Data_resourses\DataCharm 公眾號\Python\學術圖表繪製\scatter_One_Colorbar.png', width=7,height=5,dpi=900,bbox_inches='tight')plt.show()

colorbarfontdict = {"size":15,"color":"k",'family':'Times New Roman'}cb.ax.set_title('Counts',fontdict=colorbarfontdict,pad=8)cb.ax.tick_params(labelsize=11,direction='in')cb.ax.set_yticklabels(['0','10','20','30','40','50','>60'],family='Times New Roman')

此外,我們設置colorbar也不是只繪製最後一個子圖的colorbar,而其他子圖不繪製,那樣容易導致子圖大小不一。這裡單獨繪製了colorbar,代碼如下
fig.subplots_adjust(right=0.9)position = fig.add_axes([0.92, 0.12, 0.015, .78 ])cb = fig.colorbar(im3, cax=position)

這也是多子圖共用一個colorbar避免大小不一的一個小技巧,希望大家可以記住。

可以看出顏色密集部分出現「光滑」處理,其實就是通過核密度估計函數將 真實值和預測值之間進行密度值估計,再進行一個排序即可,詳細代碼如下:
import numpy as npimport matplotlib.pyplot as pltfrom scipy.stats import gaussian_kde
x = test_data['true_data'].values.ravel() y = test_data['model01_estimated'].values.ravel()xy = np.vstack([x,y])z = gaussian_kde(xy)(xy)idx = z.argsort()x, y, z = x[idx], y[idx], z[idx]fig, ax = plt.subplots(figsize=(7,5),dpi=200)ax.scatter(x, y, c=z, s=3, edgecolor='')plt.savefig(r'E:\Data_resourses\DataCharm 公眾號\Python\學術圖表繪製\scatter_gaussian_kde.png', width=7,height=5,dpi=900,bbox_inches='tight')plt.show()

idx = z.argsort()x, y, z = x[idx], y[idx], z[idx]

如需聯繫EasyShu團隊

請加微信:EasyCharts

微信公眾號【EasyShu】博文代碼集合地址

https://github.com/Easy-Shu/EasyShu-WeChat


《Python數據可視化之美》-配套原始碼下載地址

https://github.com/Easy-Shu/Beautiful-Visualization-with-python

《R語言數據可視化之美》-增強版配套原始碼下載地址

https://github.com/Easy-Shu/Beautiful-Visualization-with-R

相關焦點

  • python使用matplotlib畫動態圖
    matplotlib是python的核心繪圖庫,是python的一個開源項目,旨在為python提供一個繪圖庫。matplotlib與numpy組合是一種可行的matlab替代方案。在可視化中matplotlib是最常使用的工具,是對數據整體判斷、效果預測不可或缺的重要模塊。下面我們就來聊一聊如何使用matplotlib繪製一個二維動態圖。
  • Python空間繪圖-Colorbar詳解
    cf=ax.contourf(... ...)fig.colorbar(cf)第二個參數為colorbar繪製的默認子圖位置參數,代表當前這個colorbar將要擺放的子圖位置。從前面簡單的參數來看,colorbar自身很難實現在多子圖之間挪動,而cax則可以輕鬆實現。
  • Python 選取colorbar中部分顏色
    今天給大家分享一個我覺得挺實用的,NCL無敵簡單,但是python我花了很久才解決的colorbar的問題。
  • python畫圖自定義colorbar
    自定義colorbar包含兩方面:這兩項比較簡單和實用,matplotlib和seaborn都可以嘗試。
  • 還在對Matplotlib繁瑣的圖層設置感到煩惱!?快來看看這個Python繪圖工具包吧
    反正以上列出的幾點就是我在使用matplotlib自定義繪製圖表時最大的感觸了,當然,本期推文不是來吐槽的,是來為大家提供好的解決方法的。下面就介紹下今天的主角-- ProPlot。說真的!當我剛開始發現這個包時:「嗯?不錯,logo和matplotlib很像」,可是,當我在熟悉大多數和經常使用matplotlib繪圖時,回來再看這個工具包時:「我ri,真香!!我之前幹了啥?趕快用起來!」。
  • python可視化之matplotlib庫餅形圖的基本用法與應用實例
    實驗環境:已正確安裝python3.5、matplotlib1、餅形圖概念餅狀圖顯示一個整體中各項大小佔總體的百分比,可以清楚反應部分與總體的關係。在餅形圖上標出百分比為了在平面上觀察各項的比例,可以設置x與y的比例為1進行觀察。利用axes方法創建或激活軸,aspect為一個數字時,表示屏幕空間中y與x之比。
  • PyCharm安裝matplotlib教程——安裝好matplotlib但是import報錯
    輸入python -m pip install -U pip setuptools2.輸入python -m pip install matplotlib3.檢查是否已經安裝成功輸入python -m pip list成功安裝。默認安裝在D:\Python\Lib\site-packages方式二:通過下載matplotlib進行安裝。
  • 創造生動有趣的動畫,Matplotlib庫大顯身手
    在描述像過去幾年的股票價格、過去十年的氣候變化、季節性和趨勢等時間序列數據時,與靜態圖相比,動畫更能說明問題。因為,從動畫中,我們可以看到特定參數是如何隨時間而變化的。上圖是模擬雨的圖像。此圖由Matplotlib繪圖庫繪製而成,該繪圖庫常常被認為是python可視化數據包的原始數據組。Matplotlib通過50個分散點的比例和不透明度來模擬雨滴落在平面上的情景。
  • Python Matplotlib 入門教程:如何控制Matplotlib樣式
    來自:https://www.linuxmi.com/matplotlib-yangshi.html在本篇Python Matplotlib
  • matplotlib基礎繪圖命令之scatter
    在matplotlib中,scatter方法用於繪製散點圖,與plot方法不同之處在於,scatter主要用於繪製點的顏色和大小呈現梯度變化的散點圖
  • Python-matplotlib 繪圖配色設計
    2.1 默認圖表這裡首先設置一組數據,使用matplotlib的默認繪製方法進行圖表繪製,具體數據如下:array([10, 25, 12, 15, 28, 13, 20, 26, 23, 40, 39, 35, 42, 31, 29, 16, 27], dtype=int64)
  • SCI論文配色-matplotlib分類柱狀圖繪製
    但抱怨歸抱怨,接下來還是使用python-matplotlib 對上圖進行仿製。python-matplotlib 繪製分類柱狀圖的步驟相對比較簡單,即ax.bar()的靈活使用即可,下面為沒有任何定製化繪製的默認繪製代碼:import numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.family'] = "Times New Roman"
  • Matplotlib--上帝打翻了調色板
    同樣在圖形中,我們也可以運用matplotlib工具包,繪製斑斕的圖像。此次本文將從matplotlib的繪圖樣式和色彩設置兩個方面來對圖像的形式講解,重點在於色彩的應用。但是有時候,當用戶在做專題報告時,往往會希望保持整體風格的統一而不用對每張圖一張張修改,因此Matplotlib庫還提供了四種批量修改全局樣式的方式1.Matplotlib預先定義樣式Matplotlib貼心地提供了許多內置的樣式供用戶使用,使用方法很簡單,只需在python腳本的最開始輸入想使用style的名稱即可調用,嘗試調用不同內置樣式,比較區別
  • Matplotlib的安裝與繪圖
    一般屬於數據的預處理和清洗完成之後,多會把數據按照橫坐標縱坐標進行繪圖,利用人工檢查數據的使用情況 Matplotlib
  • 基於Python的圖表繪圖系統matplotlib,「動態條形圖」你了解嗎?
    來看一下上邊截取出來的數據集繪製出來的條形圖是什麼樣子的:plt.figure(figsize=(10,6))plt.barh(dff['球隊'], dff['積分']);ok,畫出來是符合要求的條形圖!
  • 關於matplotlib,你要的餅圖在這裡
    , 官方提供的餅圖Demo,功能比較比較簡單,在實際應用過程中,往往會有許多個性化的繪製需求,在這裡跟大家一起了解下餅圖(pie chart)的一些特色的功能的實現。from matplotlib import font_manager as fmimport matplotlib as mplimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt% matplotlib inline
  • Matplotlib 動態圖還可以這樣玩,收藏了!
    是 Python 數據可視化中不可或缺的一個可視化庫,今天給大家分享的是使用 Matplotlib 來創建動態 gif 圖片,這個內容是以前沒有分享過的。4種類型的動態 gif 圖今天給大家分享的包括4種類型的動態 gif 圖,分別是單曲線動態圖、分段分不同背景顏色的動態圖、雙曲線動態圖、多圖多曲線動態圖。核心思路是通過 Matplotlib 繪製動態圖的動畫幀,然後通過 python 的 'gif' 庫來繪製動態圖片。
  • python可視化——matplotlib畫圖顏色控制
    這裡cd整理了python中matplotlib庫中color可用的顏色,之前有人整理的是圖片版,實際用的時候不怎麼方便,因策這裡整理了表格,顏色可以選擇,方便使用。以上說明來自matplotlib官網:Specifying Colors(https://matplotlib.org/users/colors.html)Github上也有指定可用顏色的源文件:_color_data.py(https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib
  • matplotlib中的黑魔法:constrained和tight layout
    當然,我們可以不斷調整屬性的值,直到效果滿意為止,但是在matplotlib中,為我們提供了更好的解決方法,通過constrained和tight layout兩種布局,可以使得圖形元素進行一定程度的自適應1. constrained layout用法如下>>> plt.subplots(
  • 還在煩惱用python在同一圖裡畫多數據曲線嗎?教你6種姿勢搞定
    概要:python的matplotlib作圖很強大,本文教你用6種不同方式解決將多種數據曲線畫到一起。問題:今天,老闆又要一個數據報表,小明選擇用 python來實現。「用matplotlib用來可視化。並且必須用不同顏色標誌每個數據曲線,曲線這些顏色也應該在Python裡自動選擇。」