Matplotlib 可視化大師系列(三):plt.bar() 與 plt.barh() - 清晰對比的柱狀圖

目錄

      • Matplotlib 可視化大師系列博客總覽
  • Matplotlib 可視化大師系列(三):plt.bar() 與 plt.barh() - 清晰對比的柱狀圖
    • 一、 柱狀圖是什么?何時使用?
    • 二、 函數原型與核心參數
      • `plt.bar(x, height, ...)` - 垂直柱狀圖
      • `plt.barh(y, width, ...)` - 水平柱狀圖
    • 三、 從入門到精通:代碼示例
      • 示例 1:基礎垂直柱狀圖
      • 示例 2:分組柱狀圖
      • 示例 3:堆疊柱狀圖與水平柱狀圖
    • 四、 最佳實踐與常見陷阱
    • 五、 總結


Matplotlib 可視化大師系列博客總覽

本系列旨在提供一份系統、全面、深入的 Matplotlib 學習指南。以下是博客列表:

  1. 基礎篇plt.plot() - 繪制折線圖的利刃
  2. 分布篇plt.scatter() - 探索變量關系的散點圖
  3. 比較篇plt.bar()plt.barh() - 清晰對比的柱狀圖
  4. 統計篇plt.hist()plt.boxplot() - 洞察數據分布
  5. 占比篇plt.pie() - 展示組成部分的餅圖
  6. 高級篇plt.imshow() - 繪制矩陣與圖像的強大工具
  7. 專屬篇: 繪制誤差線 (plt.errorbar())、等高線 (plt.contour()) 等特殊圖表
  8. 綜合篇: 在一張圖中組合多種圖表類型

Matplotlib 可視化大師系列(三):plt.bar() 與 plt.barh() - 清晰對比的柱狀圖

柱狀圖是數據可視化中最常用、最有效的圖表類型之一,專門用于比較不同類別的數值。Matplotlib 提供了 plt.bar()(垂直柱狀圖)和 plt.barh()(水平柱狀圖)兩個函數來創建這種圖表。本文將深入解析這兩個函數,幫助你掌握創建清晰、準確對比圖表的藝術。

一、 柱狀圖是什么?何時使用?

柱狀圖使用高度(或長度)不同的矩形(柱體)來表示不同類別的數值大小。每個柱體代表一個類別,柱體的高度代表該類別的數值。

適用場景:

  • 比較不同類別的數量(如不同產品的銷量)
  • 顯示數據隨時間的變化(時間序列數據,但通常用于離散時間點)
  • 對比分組數據

與直方圖的區別(重要!):

  • 柱狀圖 (Bar Chart):比較不同類別的數值。X軸是分類變量(如城市名、產品類型)。
  • 直方圖 (Histogram):顯示單個變量的分布情況。X軸是連續數值被分成的區間(bins)。

二、 函數原型與核心參數

plt.bar(x, height, ...) - 垂直柱狀圖

plt.bar(x, height, width=0.8, bottom=None, *, align='center', **kwargs)

plt.barh(y, width, ...) - 水平柱狀圖

plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)

核心參數詳解:

  1. 定位參數:
    • x / y: 柱體中心的坐標。對于分類數據,通常是類別標簽的索引(如 [0, 1, 2, 3])或直接是標簽(需要配合 plt.xticks())。
    • height / width: 柱體的高度(垂直)或寬度(水平),即要比較的數值。
  2. 尺寸參數:
    • width: (垂直) 柱體的寬度,默認0.8。通常保持在0.8以下,柱體間會有清晰間隔。
    • height: (水平) 柱體的高度,默認0.8。
    • bottom / left: 柱體的底部(垂直)或左側(水平)基準線。這是創建堆疊柱狀圖的關鍵!
  3. 對齊方式:
    • align: 柱體與X坐標的對齊方式。'center'(默認,中心對齊)或 'edge'(邊緣對齊)。
  4. 樣式參數 (**kwargs):
    • color / facecolor / fc: 柱體填充顏色。可以是一個顏色(所有柱體相同),也可以是一個顏色列表(每個柱體不同)。
    • edgecolor / ec: 柱體邊緣顏色。
    • linewidth / lw: 柱體邊緣線寬。
    • alpha: 透明度。
    • label: 用于圖例的標簽(為一組柱體設置標簽)。
    • tick_label: 直接指定每個柱體的刻度標簽,替代默認的x坐標。

三、 從入門到精通:代碼示例

示例 1:基礎垂直柱狀圖

import matplotlib.pyplot as plt
import numpy as np# 數據
categories = ['Apples', 'Oranges', 'Bananas', 'Grapes']
values = [15, 12, 18, 9]# 創建圖形
fig, ax = plt.subplots(figsize=(8, 5))# 繪制柱狀圖
bars = ax.bar(categories, values)# 美化
ax.set_title('Fruit Sales Comparison')
ax.set_ylabel('Quantity Sold')
ax.grid(axis='y', linestyle='--', alpha=0.7) # 只在y軸加網格線# 在柱體頂端添加數值標簽 (一個非常有用的技巧!)
for bar in bars:height = bar.get_height()ax.annotate(f'{height}',xy=(bar.get_x() + bar.get_width() / 2, height),xytext=(0, 3), # 3 points vertical offsettextcoords="offset points",ha='center', va='bottom')plt.tight_layout()
plt.show()

示例 2:分組柱狀圖

通過控制每個組的X坐標和柱體寬度,可以實現分組對比。

# 數據
labels = ['Q1', 'Q2', 'Q3', 'Q4']
sales_A = [20, 35, 30, 35]
sales_B = [25, 32, 34, 20]
sales_C = [15, 25, 40, 30]x = np.arange(len(labels))  # 標簽位置: [0, 1, 2, 3]
width = 0.25  # 柱寬fig, ax = plt.subplots(figsize=(10, 6))# 繪制三組柱體,每組柱體的x坐標偏移一個width
rects1 = ax.bar(x - width, sales_A, width, label='Product A')
rects2 = ax.bar(x, sales_B, width, label='Product B')
rects3 = ax.bar(x + width, sales_C, width, label='Product C')# 添加標簽和標題
ax.set_xlabel('Quarters')
ax.set_ylabel('Sales')
ax.set_title('Quarterly Sales by Product')
ax.set_xticks(x) # 設置x軸刻度位置
ax.set_xticklabels(labels) # 設置x軸刻度標簽
ax.legend()# 添加數值標簽
def autolabel(rects):for rect in rects:height = rect.get_height()ax.annotate('{}'.format(height),xy=(rect.get_x() + rect.get_width()/2, height),xytext=(0, 3),textcoords="offset points",ha='center', va='bottom')autolabel(rects1)
autolabel(rects2)
autolabel(rects3)fig.tight_layout()
plt.show()

示例 3:堆疊柱狀圖與水平柱狀圖

# 堆疊柱狀圖 - 使用 bottom 參數
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))# 數據
men_means = [20, 35, 30, 35]
women_means = [25, 32, 34, 20]
labels = ['Q1', 'Q2', 'Q3', 'Q4']
x = np.arange(len(labels))# 左側:堆疊柱狀圖
ax1.bar(labels, men_means, label='Men')
ax1.bar(labels, women_means, bottom=men_means, label='Women') # 關鍵:bottom=men_means
ax1.set_ylabel('Scores')
ax1.set_title('Stacked Bar Chart')
ax1.legend()# 右側:水平柱狀圖 - 非常適合類別名稱較長的情況
categories = ['Very Long Category Name A', 'Long Category Name B', 'Category C', 'D']
values = [15, 12, 18, 9]bars = ax2.barh(categories, values)
ax2.set_xlabel('Value')
ax2.set_title('Horizontal Bar Chart')
ax2.grid(axis='x', linestyle='--', alpha=0.7)# 在水平柱體右側添加數值標簽
for bar in bars:width = bar.get_width()ax2.annotate(f'{width}',xy=(width, bar.get_y() + bar.get_height()/2),xytext=(3, 0),textcoords="offset points",ha='left', va='center')plt.tight_layout()
plt.show()

四、 最佳實踐與常見陷阱

  1. 最佳實踐:
    • 排序數據: 除非有特定順序要求(如時間),否則將柱體按高度排序,使比較更容易。
    • 從零基線開始: Y軸必須從0開始,否則會扭曲數據的真實比例,誤導觀眾。
    • 添加數值標簽: 在柱體頂端或末端直接標注數值,讓讀者無需猜測。
    • 使用水平柱狀圖: 當類別名稱很長或類別數量很多時,水平柱狀圖可讀性更高。
    • 謹慎使用顏色: 使用顏色來傳達信息(如突出特定類別),而不是隨意裝飾。
  2. 常見陷阱:
    • 過度擁擠: 柱體太多、太窄、間距太小會讓圖表難以閱讀。考慮分組顯示或使用其他圖表類型(如折線圖)。
    • 錯誤的排序: 隨意排序類別會掩蓋數據的真實模式。
    • 3D效果: 避免使用3D柱狀圖,它們會扭曲感知,難以準確比較高度。
    • 混淆柱狀圖和直方圖: 確保你使用的是正確的圖表類型來回答你的問題。

五、 總結

plt.bar()plt.barh() 是進行數據對比的利器。

  • 核心功能: 用矩形的高度/長度表示類別數值的大小。
  • 關鍵參數x/y(位置),height/width(數值),bottom/left(堆疊),color(樣式)。
  • 高級應用: 分組柱狀圖、堆疊柱狀圖。
  • 關鍵技巧: 添加數值標簽、排序數據、保持零基線。

掌握柱狀圖,意味著你能夠清晰、準確地展示數據之間的比較關系,這是數據故事中不可或缺的一環。在下一篇文章中,我們將深入探討數據的分布,使用 plt.hist()plt.boxplot() 來揭示數據背后的統計特性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94348.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 FastAPI 和 OpenFeature 使用 Feature Flag 控制業務功能

模擬業務場景:多租戶系統跨域轉賬,需要控制某租戶下某用戶是否可以在某域轉賬 open_feature_util.py import typing from abc import abstractmethod, ABCMeta from typing import Sequencefrom openfeature.evaluation_context import EvaluationContex…

Stm32通過ESP8266 WiFi連接阿里云平臺

本文將介紹stm32如何通過WiFi來連接阿里云,上傳數據和接收指令。要先與阿里云建立TCP連接,然后再通過MQTT協議交互。 大體流程:1、在阿里云網頁上創建產品和設備;2、stm32通過WiFi連接云平臺;3、MQTT連接阿里云&#…

北京-測試-入職甲方金融-上班第三天

今日上班時間9-20.18,再加42分鐘就可以拿到75塊錢了,但我想回家,所以下班今天上午有人事舉辦的入職培訓,下午有業務培訓,培訓完領導給我安排了兩個需求。慌死,嚇死,我都不懂,業務和工…

Java基礎第2天總結

使用switch時注意事項:表達式類型只能是byte、short、int、char,JDK5開始支持枚舉,JDK7開始支持String,不支持double、float、long(精確度問題,小數有點不精確)。case給出的值不允許重復,且只能是字面量,不…

鴻蒙開發中的List組件詳解

目錄 引言 1.List組件基礎 2.List接口參數 1.space 2.initialIndex 3.scroller 3.ListView的屬性 1.listDirection 2.lanes 3.divider 4.scrollBar 4.布局與約束 5.ListItem生命周期 1.使用ForEach創建ListItem 2.使用LazyForEach創建ListItem 3…

2026界計算機專業畢業的有福了!(開題報告任務書)

開題報告 我們以基于Java的婚紗店管理系統為案例進行指導。 任務書: 首先是畢設的立題依據,這個主要描寫一些簡潔大體的大白話,描述一下你為什么要做這個題目的畢設。 那就需要你描述一下現階段社會面婚紗店的運營情況,寫一些…

安全、高效、可靠的物理隔離網絡安全專用設備———信刻光盤安全隔離與文件單向導入系統!

著各種數據傳輸、儲存技術、信息技術的快速發展,保護信息安全是重中之重。軍工企業、政府、部隊及企事業單位等利用A網與B網開展導入/導出相關工作已成為不可逆轉的趨勢。針對于業務需要與保密規范相關要求,涉及重要秘密信息,需做到完全的物理…

JetPack 與 PyTorch 版本對應及資源詳情

下載鏈接 JetPack 版本適配 PyTorch 版本發布日期可下載資源(.whl 安裝包 / 文檔)JP 6.1PyTorch 2.5.0a0(構建號:872d972e41.nv24.08.17622132)2024/10/01- torch-2.5.0a0872d972e41.nv24.08.17622132-cp310-cp310-li…

【c++進階系列】:萬字詳解多態

🔥 本文專欄:c 🌸作者主頁:努力努力再努力wz 💪 今日博客勵志語錄: 你以為自己在孤獨地爬坡嗎?看看身后吧——那些被汗水浸濕的腳印,早已連成一道向上的階梯 ★★★ 本文前置知識&am…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年8月23日第168彈

從今天開始,咱們還是暫時基于舊的模型進行預測,好了,廢話不多說,按照老辦法,重點8-9碼定位,配合三膽下1或下2,殺1-2個和尾,再殺4-5個和值,可以做到100-300注左右。(1)定位…

分布式搜索(Elasticsearch)深入用法

目錄 數據聚合 聚合的種類 DSL實現聚合 桶聚合 度量聚合 RestAPI實現聚合 多條件聚合 自動補全 拼音分詞器 自定義分詞器 自動補全查詢 實現搜索框自動補全 數據同步 數據同步思路分析 實現elasticsearch與數據庫數據同步 集群 搭建ES集群 集群腦裂問題 集群…

java:接口與實現類

1. Java 基礎層面接口(Interface) 只是方法的定義/規范,里面沒有真正的邏輯。例如:public interface IBookService {boolean save(Book book); }👉 這里只說明了:我要有一個 save 方法,但“怎么…

Chrome 插件開發實戰:從入門到進階

1.1 Chrome 插件的魅力與應用場景Chrome 插件是增強 Chrome 瀏覽器功能的得力助手,能實現廣告攔截、密碼管理、標簽管理等實用功能。在日常辦公中,我們可以借助插件提升效率,如自動填充表單、快速保存網頁內容;在瀏覽網頁時&#…

通過官方文檔詳解Ultralytics YOLO 開源工程-熟練使用 YOLO11實現分割、分類、旋轉框檢測和姿勢估計(附測試代碼)

目錄 前言: 1.了解ultralytics工程與yolo模型 1.1 yolo11可以為我們做些什 1.2 yolo11模型的高性能 1.3 對于yolo11一些常見的問題 1.3.1 YOLO11 如何以更少的參數實現更高的精度? 1.3.2 YOLO11 可以部署在邊緣設備上嗎? 2. 深入了解y…

vue實現小程序oss分片上傳

隨著小程序越來越普及,小程序上傳文件必不可少,那么上傳的文件大小就不可控了,小則幾mb,大到好幾百mb,小文件還可以,但是一到超過200mb或稍微再大些的小程序就很容易上傳失敗,導致功能不能繼續進行。以下我們就來解決這個問題,將大文件實現分片上傳 溫馨提示,不要看內…

14.Shell腳本修煉手冊--玩轉循環結構(While 與 Until 的應用技巧與案例)

while 循環和 until 循環的應用實踐 文章目錄while 循環和 until 循環的應用實踐當型和直到型循環:兩種 "重復" 的邏輯while 循環:滿足條件就繼續until 循環:不滿足條件就繼續基礎示例:從簡單場景學用法示例 1&#xff…

chromadb使用hugging face模型時利用鏡像網站下載注意事項

chromadb默認使用sentence-transformers/all-MiniLM-L6-v2的詞嵌入(詞向量)模型,如果在程序首次運行時,collection的add或query操作時如果沒有指定embeddings或query_embeddings,程序會自動下載相關嵌入向量模型&#…

基于大模型的對話式推薦系統技術架構設計

注:此文章內容均節選自充電了么創始人,CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》(跟我一起學人工智能)【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

第1章 React組件開發基礎

在掌握React開發之前,我們需要先建立扎實的組件開發基礎。這些基礎知識不僅影響你的開發效率,更決定了應用程序的性能、可維護性和團隊協作的順暢程度。 本章將深入探討React組件開發的核心技巧,從JSX語法優化到組件架構設計,幫你建立正確的React開發思維模式。 ??? 本…

【yocto】Yocto Project 配置層(.conf)文件語法詳解

【加關注,不迷路,持續輸出中...】Yocto Project 是一個開源的嵌入式 Linux 系統構建框架,其核心是通過元數據(Metadata)來定義如何構建系統。這些元數據主要包括配方(.bb / .bbappend)、配置&am…