Python繪制克利夫蘭點圖:從入門到實戰

Python繪制克利夫蘭點圖:從入門到實戰

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

引言

克利夫蘭點圖(Cleveland Dot Plot)是一種強大的數據可視化工具,由統計學家William Cleveland在1984年提出。這種圖表特別適合展示多個類別的數值比較,比傳統的條形圖更直觀、更精確。本文將詳細介紹如何使用Python創建克利夫蘭點圖,從基礎概念到實際應用。

什么是克利夫蘭點圖?

克利夫蘭點圖是一種簡潔而有效的數據可視化方式,它通過點和水平線的組合來展示數據。每個數據點都通過一條水平線連接到坐標軸,使得數據之間的比較更加直觀。

主要特點:

  1. 使用點和水平線展示數據
  2. 適合展示多個類別的數值比較
  3. 數據排序后更容易觀察趨勢
  4. 支持多數據系列的對比展示

環境準備

在開始之前,我們需要安裝必要的Python庫:

pip install matplotlib seaborn pandas numpy

代碼實現

讓我們通過實際的例子來學習如何創建克利夫蘭點圖。我們將使用matplotlib和seaborn來實現這個可視化效果。

1. 基礎設置

首先,我們需要導入必要的庫并設置中文字體支持:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np# 設置中文字體
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號

2. 準備數據

在我們的示例中,我們使用城市溫度數據來展示克利夫蘭點圖的效果:

# 示例數據:不同城市的平均溫度
cities = ['北京', '上海', '廣州', '深圳', '成都', '杭州']
temperatures = [12, 16, 22, 24, 18, 17]# 創建DataFrame
df = pd.DataFrame({'城市': cities,'溫度': temperatures
})# 按溫度排序
df = df.sort_values('溫度')

3. 創建基礎點圖

使用matplotlib創建基礎克利夫蘭點圖:

# 創建圖形
plt.figure(figsize=(10, 6))# 繪制點
plt.scatter(df['溫度'], range(len(df)), s=100, color='blue', alpha=0.6)# 添加水平線
for i, temp in enumerate(df['溫度']):plt.hlines(i, 0, temp, colors='gray', linestyles='--', alpha=0.5)# 設置y軸標簽
plt.yticks(range(len(df)), df['城市'])# 添加標題和標簽
plt.title('各城市平均溫度對比', fontsize=14)
plt.xlabel('溫度 (°C)', fontsize=12)# 添加網格線
plt.grid(True, axis='x', linestyle='--', alpha=0.3)

實際應用場景

克利夫蘭點圖在以下場景特別有用:

  1. 數據對比:比較不同類別之間的數值差異
  2. 趨勢分析:展示數據的變化趨勢
  3. 多維度分析:同時展示多個指標
  4. 時間序列對比:比較不同時間點的數據

進階技巧

1. 多數據系列對比

可以同時展示多個數據系列:

# 創建更復雜的示例數據
categories = ['產品A', '產品B', '產品C', '產品D', '產品E']
sales_2022 = [120, 85, 150, 95, 110]
sales_2023 = [140, 95, 160, 105, 130]# 創建DataFrame
df = pd.DataFrame({'類別': categories,'2022年': sales_2022,'2023年': sales_2023
})

2. 多維度分析

展示產品的多個指標:

# 創建業務數據
products = ['產品A', '產品B', '產品C', '產品D', '產品E']
metrics = {'銷售額': [120, 85, 150, 95, 110],'利潤率': [25, 18, 30, 22, 28],'客戶滿意度': [4.2, 3.8, 4.5, 4.0, 4.3],'市場份額': [15, 10, 20, 12, 18]
}

3. 自定義樣式

可以通過修改各種參數來優化圖表外觀:

# 設置顏色
colors = ['blue', 'green', 'red', 'purple']# 設置透明度
alpha = 0.6# 設置點的大小
s = 100# 設置網格線樣式
plt.grid(True, axis='x', linestyle='--', alpha=0.3)

多數據序列演示

讓我們通過一個實際的例子來展示如何使用克利夫蘭點圖比較多個數據序列。這個例子將展示不同產品在2022年和2023年的銷售數據對比。

1. 數據準備

# 創建示例數據
categories = ['產品A', '產品B', '產品C', '產品D', '產品E']
sales_2022 = [120, 85, 150, 95, 110]
sales_2023 = [140, 95, 160, 105, 130]# 創建DataFrame
df = pd.DataFrame({'類別': categories,'2022年': sales_2022,'2023年': sales_2023
})# 計算增長率
df['增長率'] = ((df['2023年'] - df['2022年']) / df['2022年'] * 100).round(1)# 按2023年銷售額排序
df = df.sort_values('2023年')

2. 創建雙圖表對比

# 創建圖形
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))# 繪制銷售額對比圖
for year, color in zip(['2022年', '2023年'], ['gray', 'blue']):ax1.scatter(df[year], range(len(df)), s=100, color=color, alpha=0.6, label=year)for i, value in enumerate(df[year]):ax1.hlines(i, 0, value, colors=color, linestyles='--', alpha=0.3)ax1.set_yticks(range(len(df)))
ax1.set_yticklabels(df['類別'])
ax1.set_title('2022-2023年銷售額對比', fontsize=14)
ax1.set_xlabel('銷售額 (萬元)', fontsize=12)
ax1.legend()
ax1.grid(True, axis='x', linestyle='--', alpha=0.3)# 繪制增長率圖
ax2.scatter(df['增長率'], range(len(df)), s=100, color='green', alpha=0.6)
for i, rate in enumerate(df['增長率']):ax2.hlines(i, 0, rate, colors='green', linestyles='--', alpha=0.3)ax2.set_yticks(range(len(df)))
ax2.set_yticklabels(df['類別'])
ax2.set_title('2022-2023年增長率對比', fontsize=14)
ax2.set_xlabel('增長率 (%)', fontsize=12)
ax2.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()
plt.show()

3. 圖表解讀

這個多數據序列的克利夫蘭點圖展示了:

  1. 銷售額對比

    • 左側圖表展示了2022年和2023年的銷售額對比
    • 使用不同顏色區分不同年份
    • 通過水平線連接點,便于比較同一產品在不同年份的表現
  2. 增長率分析

    • 右側圖表展示了各產品的年度增長率
    • 使用綠色表示增長情況
    • 可以直觀看出哪些產品增長最快
  3. 數據排序

    • 按2023年銷售額排序,便于觀察產品表現
    • 清晰的標簽和圖例,提高可讀性

4. 完整的多數據序列代碼

def create_multi_series_cleveland_plot():# 創建示例數據categories = ['產品A', '產品B', '產品C', '產品D', '產品E']sales_2022 = [120, 85, 150, 95, 110]sales_2023 = [140, 95, 160, 105, 130]# 創建DataFramedf = pd.DataFrame({'類別': categories,'2022年': sales_2022,'2023年': sales_2023})# 計算增長率df['增長率'] = ((df['2023年'] - df['2022年']) / df['2022年'] * 100).round(1)# 按2023年銷售額排序df = df.sort_values('2023年')# 創建圖形fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))# 繪制銷售額對比圖for year, color in zip(['2022年', '2023年'], ['gray', 'blue']):ax1.scatter(df[year], range(len(df)), s=100, color=color, alpha=0.6, label=year)for i, value in enumerate(df[year]):ax1.hlines(i, 0, value, colors=color, linestyles='--', alpha=0.3)ax1.set_yticks(range(len(df)))ax1.set_yticklabels(df['類別'])ax1.set_title('2022-2023年銷售額對比', fontsize=14)ax1.set_xlabel('銷售額 (萬元)', fontsize=12)ax1.legend()ax1.grid(True, axis='x', linestyle='--', alpha=0.3)# 繪制增長率圖ax2.scatter(df['增長率'], range(len(df)), s=100, color='green', alpha=0.6)for i, rate in enumerate(df['增長率']):ax2.hlines(i, 0, rate, colors='green', linestyles='--', alpha=0.3)ax2.set_yticks(range(len(df)))ax2.set_yticklabels(df['類別'])ax2.set_title('2022-2023年增長率對比', fontsize=14)ax2.set_xlabel('增長率 (%)', fontsize=12)ax2.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()plt.show()if __name__ == '__main__':create_multi_series_cleveland_plot()

注意事項

  1. 數據量不宜過多,建議控制在10-15個類別以內
  2. 確保數據之間的差異足夠明顯
  3. 選擇合適的顏色方案,避免使用過于相似的顏色
  4. 添加適當的圖例和標簽
  5. 注意中文字體的顯示問題,確保系統安裝了所需的中文字體

總結

克利夫蘭點圖是一種強大的數據可視化工具,特別適合展示多個類別的數值比較。通過Python和matplotlib,我們可以輕松創建美觀且功能豐富的克利夫蘭點圖。在實際應用中,要根據具體需求選擇合適的展示方式,并注意數據的可讀性和美觀性。

完整代碼

完整的代碼實現如下,包含基礎示例和多數據序列示例:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np# 設置中文字體
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef create_basic_cleveland_plot():"""創建基礎克利夫蘭點圖"""# 示例數據cities = ['北京', '上海', '廣州', '深圳', '成都', '杭州']temperatures = [12, 16, 22, 24, 18, 17]# 創建DataFramedf = pd.DataFrame({'城市': cities,'溫度': temperatures})# 按溫度排序df = df.sort_values('溫度')# 創建圖形plt.figure(figsize=(10, 6))# 繪制點plt.scatter(df['溫度'], range(len(df)), s=100, color='blue', alpha=0.6)# 添加水平線for i, temp in enumerate(df['溫度']):plt.hlines(i, 0, temp, colors='gray', linestyles='--', alpha=0.5)# 設置y軸標簽plt.yticks(range(len(df)), df['城市'])# 添加標題和標簽plt.title('各城市平均溫度對比', fontsize=14)plt.xlabel('溫度 (°C)', fontsize=12)# 添加網格線plt.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()plt.show()def create_multi_series_cleveland_plot():"""創建多數據序列克利夫蘭點圖"""# 創建示例數據categories = ['產品A', '產品B', '產品C', '產品D', '產品E']sales_2022 = [120, 85, 150, 95, 110]sales_2023 = [140, 95, 160, 105, 130]# 創建DataFramedf = pd.DataFrame({'類別': categories,'2022年': sales_2022,'2023年': sales_2023})# 計算增長率df['增長率'] = ((df['2023年'] - df['2022年']) / df['2022年'] * 100).round(1)# 按2023年銷售額排序df = df.sort_values('2023年')# 創建圖形fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))# 繪制銷售額對比圖for year, color in zip(['2022年', '2023年'], ['gray', 'blue']):ax1.scatter(df[year], range(len(df)), s=100, color=color, alpha=0.6, label=year)for i, value in enumerate(df[year]):ax1.hlines(i, 0, value, colors=color, linestyles='--', alpha=0.3)ax1.set_yticks(range(len(df)))ax1.set_yticklabels(df['類別'])ax1.set_title('2022-2023年銷售額對比', fontsize=14)ax1.set_xlabel('銷售額 (萬元)', fontsize=12)ax1.legend()ax1.grid(True, axis='x', linestyle='--', alpha=0.3)# 繪制增長率圖ax2.scatter(df['增長率'], range(len(df)), s=100, color='green', alpha=0.6)for i, rate in enumerate(df['增長率']):ax2.hlines(i, 0, rate, colors='green', linestyles='--', alpha=0.3)ax2.set_yticks(range(len(df)))ax2.set_yticklabels(df['類別'])ax2.set_title('2022-2023年增長率對比', fontsize=14)ax2.set_xlabel('增長率 (%)', fontsize=12)ax2.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()plt.show()def create_multi_metrics_cleveland_plot():"""創建多維度指標克利夫蘭點圖"""# 創建業務數據products = ['產品A', '產品B', '產品C', '產品D', '產品E']metrics = {'銷售額': [120, 85, 150, 95, 110],'利潤率': [25, 18, 30, 22, 28],'客戶滿意度': [4.2, 3.8, 4.5, 4.0, 4.3],'市場份額': [15, 10, 20, 12, 18]}# 創建DataFramedf = pd.DataFrame(metrics, index=products)# 標準化數據df_normalized = (df - df.min()) / (df.max() - df.min())# 創建圖形plt.figure(figsize=(12, 8))# 為每個指標繪制點colors = ['blue', 'green', 'red', 'purple']for (metric, color) in zip(metrics.keys(), colors):plt.scatter(df_normalized[metric], range(len(products)), s=100, color=color, alpha=0.6, label=metric)for i, value in enumerate(df_normalized[metric]):plt.hlines(i, 0, value, colors=color, linestyles='--', alpha=0.3)plt.yticks(range(len(products)), products)plt.title('產品多維度分析', fontsize=14)plt.xlabel('標準化得分', fontsize=12)plt.legend()plt.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()plt.show()if __name__ == '__main__':print("運行基礎克利夫蘭點圖示例...")create_basic_cleveland_plot()print("\n運行多數據序列克利夫蘭點圖示例...")create_multi_series_cleveland_plot()print("\n運行多維度指標克利夫蘭點圖示例...")create_multi_metrics_cleveland_plot()

這個完整的代碼包含了三個主要函數:

  1. create_basic_cleveland_plot(): 創建基礎克利夫蘭點圖
  2. create_multi_series_cleveland_plot(): 創建多數據序列克利夫蘭點圖
  3. create_multi_metrics_cleveland_plot(): 創建多維度指標克利夫蘭點圖

運行代碼時會依次展示這三種不同類型的克利夫蘭點圖,幫助讀者理解不同場景下的應用。

參考資料

  1. Matplotlib官方文檔
  2. 數據可視化最佳實踐指南
  3. Cleveland Dot Plot的歷史與應用

希望這篇文章能幫助你理解并掌握克利夫蘭點圖的創建方法。如果你有任何問題或建議,歡迎在評論區留言討論。

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

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

相關文章

LVGL- Calendar 日歷控件

1 日歷控件 1.1 日歷背景 lv_calendar 是 LVGL(Light and Versatile Graphics Library)提供的標準 GUI 控件之一,用于顯示日歷視圖。它支持用戶查看某年某月的完整日歷,還可以實現點擊日期、標記日期、導航月份等操作。這個控件…

多指標組合策略

該策略(MultiConditionStrategy)是一種基于多種技術指標和市場條件的交易策略。它通過綜合考慮多個條件來生成交易信號,從而決定買入或賣出的時機。 以下是對該策略的詳細分析: 交易邏輯思路 1. 條件1:星期幾和價格變化判斷 - 該條件根據當前日期是星期幾以及價格的變化…

BC 范式與 4NF

接下來我們詳細解釋 BC 范式(Boyce-Codd范式,簡稱 BCNF),并通過具體例子說明其定義和應用。 一、BC范式的定義 BC范式(Boyce-Codd范式,BCNF)是數據庫規范化理論中的一種范式,它比第…

基于 CSS Grid 的網頁,拆解頁面整體布局結構

通過以下示例拆解網頁整體布局結構&#xff1a; 一、基礎結構&#xff08;HTML骨架&#xff09; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

采購流程規范化如何實現?日事清流程自動化助力需求、采購、財務高效協作

采購審批流程全靠人推進&#xff0c;內耗嚴重&#xff0c;效率低下&#xff1f; 花重金上了OA&#xff0c;結果功能有局限、不靈活&#xff1f; 問題出在哪里&#xff1f;是我們的要求太多、太苛刻嗎&#xff1f;NO&#xff01; 流程名稱&#xff1a; 采購審批管理 流程功能…

全棧項目搭建指南:Nuxt.js + Node.js + MongoDB

全棧項目搭建指南&#xff1a;Nuxt.js Node.js MongoDB 一、項目概述 我們將構建一個完整的全棧應用&#xff0c;包含&#xff1a; 前端&#xff1a;Nuxt.js (SSR渲染)后端&#xff1a;Node.js (Express/Koa框架)數據庫&#xff1a;MongoDB后臺管理系統&#xff1a;集成在同…

NVMe簡介6之PCIe事務層

PCIe的事務層連接了PCIe設備核心與PCIe鏈路&#xff0c;這里主要基于PCIe事務層進行分析。事務層采用TLP傳輸事務&#xff0c;完整的TLP由TLPPrefix、TLP頭、Payload和TLP Digest組成。TLP頭是TLP中最關鍵的部分&#xff0c;一般由三個或四個雙字的長度&#xff0c;其格式定義如…

Python異常模塊和包

異常 當檢測到一個錯誤時&#xff0c;Python解釋器就無法繼續執行了&#xff0c;反而出現了一些錯誤的提示&#xff0c;這就是所謂的“異常”, 也就是我們常說的BUG 例如&#xff1a;以r方式打開一個不存在的文件。 f open(‘python1.txt’,‘r’,encoding‘utf-8’) 當我們…

匯編:循環程序設計

一、 實驗要求 熟練掌握循環程序設計的基本方法熟練掌握單片機外部存儲空間的訪問方法 二、 實驗設計 1.整體思路 先初始化一些寄存器和數據存儲位置&#xff0c;然后調用兩個子程序Procedure1和Procedure2&#xff0c;分別從SRC復制數據到DEST&#xff0c;一個從開頭到末尾&…

典籍知識問答模塊AI問答bug修改

一、修改流式數據處理問題 1.問題描述&#xff1a;由于傳來的數據形式如下&#xff1a; event:START data:350 data:< data:t data:h data:i data:n data:k data:> data: data: data: data: data:嗯 data:&#xff0c; 導致需要修改獲取正常的當前信息id并更…

【金倉數據庫征文】- 金融HTAP實戰:KingbaseES實時風控與毫秒級分析一體化架構

文章目錄 引言&#xff1a;金融數字化轉型的HTAP引擎革命一、HTAP架構設計與資源隔離策略1.1 混合負載物理隔離架構1.1.1 行列存儲分區策略1.1.2 四級資源隔離機制 二、實時流處理與增量同步優化2.1 分鐘級新鮮度保障2.1.1 WAL日志增量同步2.1.2 流計算優化 2.2 物化視圖實時刷…

季報中的FPGA行業:U型反轉,春江水暖

上周Lattice,AMD兩大廠商相繼發布2025 Q1季報,盡管恢復速度各異,但同時傳遞出FPGA行業整體回暖的復蘇信號。 5月5日,Lattice交出了“勉強及格”的答卷,報告季度營收1億2000萬,與華爾街的預期基本相符。 對于這家聚焦在中小規模器件的領先廠商而言,按照其CEO的預期,長…

使用 javap 深入理解 Java 字節碼

引言 Java 是一種廣泛使用的高級編程語言,其獨特之處在于編譯后的代碼不是直接的機器碼,而是一種稱為字節碼的中間表示形式。字節碼存儲在 .class 文件中,由 Java 虛擬機 (JVM) 解釋或即時編譯為特定平臺的機器碼。這種設計賦予了 Java 平臺無關性,即“一次編寫,到處運行…

LeetCode_sql刷題(3482.分析組織層級)

題目描述&#xff1a;3482. 分析組織層級 - 力扣&#xff08;LeetCode&#xff09; 表&#xff1a;Employees ------------------------- | Column Name | Type | ------------------------- | employee_id | int | | employee_name | varchar | | manager_id …

工業場景輪式巡檢機器人純視覺識別導航的優勢剖析與前景展望

一、引言 1.1 研究背景與意義 在工業 4.0 的大背景下&#xff0c;工業生產的智能化、自動化水平不斷提高&#xff0c;對工業場景的巡檢工作提出了更高的要求。傳統的人工巡檢方式不僅效率低下、成本高昂&#xff0c;而且容易受到人為因素的影響&#xff0c;難以滿足現代工業生…

《棒球萬事通》球類運動有哪些項目·棒球1號位

以棒球運動為例&#xff0c;棒球運動涉及多個核心項目和比賽形式&#xff0c;以下為主要分類&#xff1a; 一、比賽環節 投球&#xff08;Pitching&#xff09; 防守方投手向擊球員投球&#xff0c;目標是讓對方難以擊中或制造出局。 擊球&#xff08;Batting&#xff09; …

第五項修煉:打造學習型組織

最近一直接到的需求&#xff0c;都是公司董事長或總經理都特別推崇《第五項修煉&#xff1a;打造學習型組織》的內容&#xff0c;讓各個層級的管理者都持續學習、應用、實踐。我不禁開始反思&#xff0c;這背后到底隱藏著什么原因&#xff1f; 隨著商業環境的變化和復雜性的增加…

國內AWS CloudFront與S3私有桶集成指南:安全訪問靜態內容

在現代web應用架構中,將靜態內容存儲在Amazon S3中并通過CloudFront分發是一種常見且高效的做法。本指南將詳細介紹如何創建私有S3桶,配置CloudFront分配,并使用Origin Access Identity (OAI)來確保安全訪問。 步驟1:創建S3桶 首先,我們需要創建一個名為"b-static&…

BUUCTF——Nmap

BUUCTF——Nmap 進入靶場 類似于一個nmap的網站 嘗試一下功能 沒什么用 看看數據包 既然跟IP相關 偽造一個XXF看看 拼接了一下沒什么用 果然沒這么簡單 嘗試一下命令注入 構造payload 127.0.0.1 | ls 應該有過濾 加了個\ 直接構造個php木馬上傳試試 127.0.0.1 | <?…

NPN、PNP三極管的應用

由于電路知識實在是難以拿出手&#xff0c;在面試的時候被問到三極管相關問題&#xff0c;相當地尷尬。在網上簡要地學習了相關的理論知識&#xff0c;在這里給出自己的理解。更為基礎的原理在這里并不提及。我們面向實際應用學習即可。 我們知道常見的三極管總是硅管&#xff…