用Python自動實現圖表可視化操作,提高工作效率,又能有更多的時間摸魚了~

来源:https://www.cnblogs.com/hahaa/archive/2022/09/23/16721036.html
-Advertisement-
Play Games

在數據分析過程中,一般提取資料庫裡面的數據時候,拿著表格數據反覆思索,希望能夠根據自己所想立馬生成一張數據可視化的圖表來更直觀的呈現數據。 但想要進行數據可視化的時候,往往需要調用很多的庫與函數,還需要數據轉換以及大量的代碼處理編寫。這都是十分繁瑣的工作,確實只為了數據可視化我們不需要實現數據可視化 ...


在數據分析過程中,一般提取資料庫裡面的數據時候,拿著表格數據反覆思索,希望能夠根據自己所想立馬生成一張數據可視化的圖表來更直觀的呈現數據。

但想要進行數據可視化的時候,往往需要調用很多的庫與函數,還需要數據轉換以及大量的代碼處理編寫。這都是十分繁瑣的工作,確實只為了數據可視化我們不需要實現數據可視化的工程編程,這都是數據分析師以及擁有專業的報表工具來做的事情,日常分析的話我們根據自己的需求直接進行快速出圖即可,而Pandas正好就帶有這個功能,當然還是依賴matplotlib庫的,只不過將代碼壓縮更容易實現。下麵就讓我們來瞭解一下如何快速出圖。

一、基礎繪圖:plot

Series和DataFrame上的plot方法只是plt.plot()的簡單包裝,這裡我們用一段實際數據來進行可視化展示:

這是一段真實地鐵通行量特征數據,我們用此數據進行展示:

 

df_flow['客流量'].plot()

# 小伙伴們在學習Python的過程中,有時候不知道怎麼學,從哪裡開始學。掌握了一些基本的知識或者做了一些案例後,不知道下一步怎麼走,不知道如何去學習更加高深的知識。
# 那麼對於這些大兄弟們,我準備了大量的免費視頻教程,PDF電子書籍,以及源代碼!
# 我都放在這個裙了 279199867  大家自取即可~ 

 

如果索引由日期組成,則調用gcf().autofmt_xdate()方法可以很好地格式化x軸。

在DataFrame上,plot()可以方便地用標簽繪製所有列:

df_flow_mark[['濕度','風級','降水量']].plot()

 

可以使用plot()中的x和y關鍵字繪製一列與另一列的對比,比如我們想要使用星期六的客流量和星期日的客流量作對比:

df_flow_7=df_flow[df_flow['日期']=='星期日'].iloc[:7,:]
df_flow_7.rename(columns={'客流量':'星期日客流量'},inplace=True)
df_flow_6=df_flow[df_flow['日期']=='星期六'].iloc[:7,:]
df_flow_6.rename(columns={'客流量':'星期六客流量'},inplace=True)
df_compare=pd.concat([columns_convert_df(df_flow_7['星期日客流量']),columns_convert_df(df_flow_6['星期六客流量'])],axis=1)
df_compare.plot(x='星期日客流量',y='星期六客流量')

 

二、底圖板塊

根據Pandas包裝後的kind關鍵字我們梳理一下底圖種類:

也可以使用DataFrame.plot方法創建這些其他繪圖而不是提供kind關鍵字參數。這使得更容易發現繪圖方法及其使用的特定參數:

df.plot.area     df.plot.barh     df.plot.density  df.plot.hist     df.plot.line     df.plot.scatter
df.plot.bar      df.plot.box      df.plot.hexbin   df.plot.kde      df.plot.pie

 

除了這些類型,還有DataFrame.hist()和DataFrame.boxplot()方法,它們使用單獨的介面。

最後,pandas中有幾個繪圖功能。以Series或DataFrame作為參數的繪圖。其中包括:

  • Scatter Matrix

  • Andrews Curves

  • Parallel Coordinates

  • Lag Plot

  • Autocorrelation Plot

  • Bootstrap Plot

  • RadViz

分別是:

  • 散射矩陣
  • 安德魯斯曲線
  • 平行坐標
  • 滯後圖
  • 自相關圖
  • 引導圖
  • 拉德維茲圖

繪圖也可以用錯誤條或表格進行裝飾。

1、條形圖

df_flow_mark['客流量'].plot(kind='bar')
df_flow_mark['客流量'].plot.bar()

 

多個標簽圖表也可以一齊繪出:

df_flow_mark[['風級','降水量']].plot.bar()

 

要生成堆疊條形圖,傳遞stacked=True:

df_flow_mark[['風級','降水量']].plot.bar(stacked=True)

 

長久看這個maatplotlib的預設地圖有點疲勞了,我這裡換個主題,還是一樣的效果不礙事。

要獲得水平條形圖可以使用barh方法:

df_flow_mark[['風級','降水量']].plot.barh(stacked=True)

 

2、直方圖

可以使用DataFrame.plo.hist()和Series.plot.hist()方法繪製直方圖.

df4 = pd.DataFrame(
    {
        "a": np.random.randn(1000) + 1,
        "b": np.random.randn(1000),
        "c": np.random.randn(1000) - 1,
    },
    columns=["a", "b", "c"],
)
plt.figure();
df4.plot.hist(alpha=0.5)

 

直方圖可以使用stacked=True進行疊加。可以使用bins關鍵字更改bin大小。

df4.plot.hist(stacked=True, bins=20);

 

可以傳遞matplotlib hist支持的其他關鍵字。例如,水平和累積直方圖可以通過orientation='horizontal’和cumulative=True繪製。

有關詳細信息,可以參閱hist方法和matplotlib hist文檔。
現有介面DataFrame.hist,但仍然可以使用hist繪製直方圖

plt.figure();
df_flow_mark['風級'].hist();

 

DataFrame.hist()可以在多個子地塊上繪製列的直方圖:

plt.figure();
df_flow_mark[['風級','降水量']].diff().hist(color="k", alpha=0.5, bins=50);

 

可以指定by關鍵字來繪製分組直方圖:

data = pd.Series(np.random.randn(1000))
 
data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4));

 

此外,還可以在DataFrame.plot.hist()中指定by關鍵字:

data = pd.DataFrame(
    {
        "a": np.random.choice(["x", "y", "z"], 1000),
        "b": np.random.choice(["e", "f", "g"], 1000),
        "c": np.random.randn(1000),
        "d": np.random.randn(1000) - 1
    }
)
data.plot.hist(by=["a", "b"], figsize=(10, 5));

 

三、箱線圖

調用

  • Series.plot.box()
  • DataFrame.plot.box()
  • DataFrame.boxplot()

可以繪製箱線圖可視化每個列中的值分佈。

df_flow_mark[['風級','降水量']].plot.box()

 


可以通過傳遞color關鍵字對Boxplot進行著色。你可以傳遞一個字典dict,key關鍵字為boxes、whiskers,medians,caps。如果dict中缺少一些鍵,則會為相應的使用預設顏色。此外,箱線圖還有sym關鍵字來指定傳單樣式。

color = {
    "boxes": "DarkGreen",
    "whiskers": "DarkOrange",
    "medians": "DarkBlue",
    "caps": "Gray",
}
df_flow_mark[['風級','降水量']].plot.box(color=color, sym="r+")

 


創建一個數據集展示更加明顯:

df = pd.DataFrame(np.random.rand(10, 5), columns=["A", "B", "C", "D", "E"])
color = {
    "boxes": "DarkGreen",
    "whiskers": "DarkOrange",
    "medians": "DarkBlue",
    "caps": "Gray",
}
df.plot.box(color=color, sym="r+")

 


此外,還可以傳遞matplotlib箱線圖支持的其他關鍵字。例如,可以通過vert=False和positions關鍵字繪製水平和自定義定位箱線圖。

df.plot.box(vert=False, positions=[1, 4, 5, 6, 8])

 

現有介面仍然可以使用DataFrame.boxplot:

df.boxplot()

 

可以使用by關鍵字參數創建分層箱線圖來創建分組。

例如

df = pd.DataFrame(np.random.rand(10, 2), columns=["Col1", "Col2"])
df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"])
plt.figure();
bp = df.boxplot(by="X")

 



還可以傳遞要列印的列子集,以及按多個列分組:

df = pd.DataFrame(np.random.rand(10, 3), columns=["Col1", "Col2", "Col3"])
df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"])
df["Y"] = pd.Series(["A", "B", "A", "B", "A", "B", "A", "B", "A", "B"])
plt.figure();
bp = df.boxplot(column=["Col1", "Col2"], by=["X", "Y"])

 


用DataFrame.plot.box()也是一樣的:

df = pd.DataFrame(np.random.rand(10, 3), columns=["Col1", "Col2", "Col3"])
df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"])
plt.figure()
bp = df.plot.box(columns=["Col1", "Col2"], by="X")

 

在箱線圖中,返回類型可以由return_type,關鍵字控制。有效選項是{“axes”、“dict”、“both”、“None}。鑲嵌面,由DataFrame.boxplot創建by關鍵字的箱線圖也會影響輸出類型:

np.random.seed(1234)
df_box = pd.DataFrame(np.random.randn(50, 2))
df_box["g"] = np.random.choice(["A", "B"], size=50)
df_box.loc[df_box["g"] == "B", 1] += 3
bp = df_box.boxplot(by="g")

 


上面的子地塊首先由數字列分割,然後由g列的值分割。下麵的子地塊首先由g值分割,然後由數字列分割。

bp = df_box.groupby("g").boxplot()

 

四、面積填充圖

可以使用Series.plot.area()和DataFrame.plot.area()創建面積圖。預設情況下,面積圖是堆疊的。要生成堆疊面積圖,每列必須全部為正值或全部為負值。

當輸入數據包含NaN時,它將自動由0填充。如果要使用不同的值進行刪除或填充,調用plot之前可以使用DataFrame.dropna()或DataFrame.fillna()。

代碼如下(示例):

df = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
df.plot.area();

 


要生成未堆疊的繪圖,請傳遞stacked=False。Alpha值設置為0.5。

df.plot.area(stacked=False);

 

五、散點圖

可以使用DataFrame.plot.scatter()方法繪製散點圖,散點圖需要x軸和y軸的數字列。這些可以由x和y關鍵字指定。

df_flow_mark.plot.scatter(x='日期',y='客流量')

 


要在單個軸上繪製多個列組,可以重覆指定目標軸的列印方法。建議指定顏色(color)和標簽(label)關鍵字以區分每個組。

df = pd.DataFrame(np.random.rand(50, 4), columns=["a", "b", "c", "d"])
df["species"] = pd.Categorical(
    ["setosa"] * 20 + ["versicolor"] * 20 + ["virginica"] * 10
)
ax = df.plot.scatter(x="a", y="b", color="DarkBlue", label="Group 1")
df.plot.scatter(x="c", y="d", color="DarkGreen", label="Group 2", ax=ax);

 


關鍵字c可以作為列的名稱,為每個點提供顏色:

df.plot.scatter(x="a", y="b", c="c", s=50);

 


如果將分類列傳遞給c,則將生成一個離散的顏色條:

df.plot.scatter(x="a", y="b", c="species", cmap="viridis", s=50);

 


可以傳遞matplotlib.scatter支持的其他關鍵字。下麵的示例顯示了一個氣泡圖,它使用DataFrame的一列作為氣泡大小。

df_flow_mark.plot.scatter(x='日期',y='客流量',s=df_flow_mark['濕度']*200)

 

六、最後

最後給大家分享一套Python視頻:Python實戰100例

今天的分享就到這裡結束遼~

大家下次再見!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 多用戶即時通訊系統04 4.編碼實現03 4.6功能實現-發送文件功能實現 4.6.1思路分析 客戶端(發送者): 先把文件a.jpg讀取到客戶端的位元組數組 把文件對應的位元組數組封裝到message對象[包含文件內容,發送者,接收者] 將message對象發送到服務端 服務端: 接收到message ...
  • 在子類派生的新方法中如何重用父類的功能 方式一:指名道姓調用某一個類下的函數=》不依賴於繼承關係 class OldboyPeople: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def f1( ...
  • 多用戶即時通訊系統04 4.編碼實現03 4.5功能實現-群聊功能實現 4.5.1思路分析 群聊的實現思路和私聊的實現非常類似。 不同的是:私聊時,服務端接收到消息後,只需要找出接收方的socket併發送消息即可 群聊時,服務端在接收到消息後需要遍歷集合中所有的線程,找出除了發送方的所有客戶端的so ...
  • 一、聚合查詢 需要導入模塊:from django.db.models import Max, Min, Sum, Count, Avg 關鍵語法:aggregate(聚合結果別名 = 聚合函數(參數)) 查詢結果:使用聚合函數,從每一個組中獲取結果:字典 註意點: 1 聚合函數必須在分組之後才能使 ...
  • java基礎 以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 https://www.cnblogs.com/lyh1024/p/16720908.html Ø 冒泡排序原理: 比較數組中,兩個相鄰的元素,如果第一個數比第二個數大,我們就交換他們的位置; 每一次比較,都會產生出一個最大,或者最 ...
  • SSD實現思路 SSD具有如下主要特點: 從YOLO中繼承了將detection轉化為regression的思路,一次完成目標定位與分類 基於Faster RCNN中的Anchor,提出了相似的Prior box; 加入基於特征金字塔(Pyramidal Feature Hierarchy)的檢測方 ...
  • 本文按照mac講解protobuf的安裝,windows上比較好安裝按照mac的基本流程就可以安裝成功,mac上的安裝有的時候比較容易出現問題 一、通過brew的方式安裝(僅Mac) 需要mac中存在brew,輸入命令:brew --version 查看是否存在brew,如不存在就進行安裝,安裝方法 ...
  • 大家好,,這篇文章咱們聊下JVM性能優化的問題 這篇文章主要介紹下JVM的運行數據區相關的內容,包括: 程式計數器 虛擬機棧 本地方法棧 堆 方法區 案例 和總結 好了,開始乾貨環節~ 作為一個常識性的知識,大家都知道位元組碼只是一個二進位文件存放在那裡。要想在jvm里跑起來,先得有個運行的記憶體環境。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...