Python中最常用的 14 种数据可视化类型的概念与代码
寫在前面
收集數據后,需要對其進行解釋和分析,以深入了解數據所蘊含的深意。而這個含義可以是關于模式、趨勢或變量之間的關系。
數據解釋是通過明確定義的方法審查數據的過程,數據解釋有助于為數據賦予意義并得出相關結論。
數據分析是對數據進行排序、分類和總結以回答研究問題的過程。我們應該快速有效地完成數據分析,并得出脫穎而出的結論。
而不同可視化的數據繪圖類型是實現以上目標的一個重要方面。隨著數據的不斷增長,這種需求也在持續增長,因此數據可視化圖是非常重要的。但是,數據可視化類型圖繁多,在實際工作中,要選擇最適合當前業務或數據的類型通常很棘手。
可視化輔助決策
研究表明,人眼是一個高帶寬大量視覺信號并行GPU,帶寬在2.339G/s,相當于一個兩萬兆網卡,具有超強的模式識別能力,且對可視符號的處理速度比數字或者文本快多個數量級,在大數據時代,數據可視化是人們洞察數據內涵、理解數據蘊藏價值的有力工具。
因此,可視化常常被用來輔助決策,如上圖,中間的一張密密麻麻的客戶表,到底能得出什么有價值的信息指導決策呢?光看一行行一列列的數據,可能需要很久才能得出一些結論,但是經過可視化,我們可以輕松的以各種形式的可視化快速掌握結論,從而輔助決策。
這就是:可視分析,即將信息提煉為知識,起到“觀物至知”對作用,便于決策者從復雜、大量、多維度的數據中快速挖掘有效信息。
本文總結介紹了多種可視化圖及其適合使用場景,并同時展示使用了常用的繪圖包(plotly、 seaborn 和 matplotlib )繪制這些圖的代碼。
條形圖
條形圖是用矩形條顯示分類數據的圖形。這些條的高度或長度與它們所代表的值成正比。條形可以是垂直的或水平的。垂直條形圖有時也稱為柱形圖。
以下是按年指示加拿大人口的條形圖。
條形圖適合應用到分類數據對比,橫置時也稱條形圖。注意: 條形圖數據條數不宜超過12條;條形圖數據條數不宜超過30條。
plotly code
import?plotly.express?as?px data_canada?=?px.data.gapminder().query("country?==?'Canada'") fig?=?px.bar(data_canada,?x='year',?y='pop') fig.show()seaborn code
import?seaborn?as?sns sns.set_context({'figure.figsize':[14,?8]}) sns.set_theme(style="whitegrid") ax?=?sns.barplot(x="year",?y="pop",?data=data_canada)改變seaborn圖表大小的三種方法
1. seaborn自帶的設置:
sns.set_context({'figure.figsize':[20,?20]}) sns.boxplot(x)2. 結合matplotlib:
from?matplotlib?import?pyplot?as?plt import?seaborn?as?sns plt.figure(figsize=(20,20))???? #?或者?plt.rcParams['figure.figsize']?=?(20.0,?20.0) sns.distplot(launch.date) plt.show()3. displot和jointplot中
ax?=?sns.boxplot(x) ax.figure.set_size_inches(12,6)以下是條形圖的類型
分組條形圖
當數據集具有需要在圖形上可視化的子組時,將使用分組條形圖。亞組通過不同的顏色進行區分。下面是這樣一個圖表的說明:
plotly code
import?plotly.express?as?px df?=?px.data.tips() fig?=?px.bar(df,?x="sex",?y="total_bill",color='smoker',?barmode='group',height=500) fig.show()seaborn code
import?seaborn?as?sb df?=?sb.load_dataset('tips') df?=?df.groupby(['size',?'sex']).agg(mean_total_bill=("total_bill",?'mean')) df?=?df.reset_index() sb.barplot(x="size",?y="mean_total_bill",hue="sex",?data=df)堆積條形圖
堆疊條形圖用于顯示數據集子組。堆疊柱狀圖將每個柱子進行分割以顯示相同類型下各個數據的大小情況。
分類:
堆積柱狀圖:
比較同類別各變量和不同類別變量總和差異。百分比堆積柱狀圖:
適合展示同類別的每個變量的比例。
數據可視化類型的概念與代碼.jpg
plotly code
import?plotly.express?as?px df?=?px.data.tips() fig?=?px.bar(df,?x="sex",?y="total_bill",?color='time') fig.show()Seaborn code
import?pandas import?matplotlib.pylab?as?plt import?seaborn?as?sns plt.rcParams["figure.figsize"]?=?[12,?6] plt.rcParams["figure.autolayout"]?=?True df?=?pandas.DataFrame(dict(number=[2,?5,?1,?6,?3],count=[56,?21,?34,?36,?12],select=[29,?13,?17,?21,?8] )) bar_plot1?=?sns.barplot(x='number',?y='count',?data=df,?label="count",color="red") bar_plot2?=?sns.barplot(x='number',?y='select',?data=df,?label="select",color="green") plt.legend(ncol=2,?loc="upper?right",frameon=True,?fontsize=15) plt.xlabel('number',?fontsize=15) plt.ylabel('select',fontsize=15) plt.xticks(fontsize=15) plt.yticks(fontsize=15) plt.show()分段條形圖
這是堆疊條形圖的類型,其中每個堆疊條形顯示其離散值占總值的百分比。總百分比為 100%。
線形圖
它將一系列數據點顯示為標記。這些點通常按其 x 軸值排序。這些點用直線段連接。折線圖用于可視化一段時間內數據的趨勢。
以下是折線圖中按年計算的加拿大預期壽命的說明。
以下是如何在情節中做到這一點:
import?plotly.express?as?px df?=?px.data.gapminder().query("country=='Canada'") fig?=?px.line(df,?x="year",?y="lifeExp",title='Life?expectancy?in?Canada') fig.show()以下是在 seabron 中的操作方法:
import?seaborn?as?sns sns.lineplot(data=df,x="year",y="lifeExp")以下是折線圖的類型
簡單線圖
簡單的折線圖僅在圖形上繪制一條線。其中一個軸定義了自變量。另一個軸包含一個依賴于它的變量。
多線圖
多條線圖包含多條線。它們代表數據集中的多個變量。這種類型的圖表可用于研究同一時期的多個變量。
import?plotly.express?as?px df?=?px.data.gapminder().query("continent?==?'Oceania'") fig?=?px.line(df,?x='year',?y='lifeExp',???????????????color='country')fig.show()seaborn code
import?seaborn?as?snssns.line plot(data=df,?x='year',y='lifeExp',?hue='country')復合折線圖
它是簡單折線圖的擴展。它用于處理來自較大數據集的不同數據組。它的每個折線圖都向下陰影到 x 軸。它讓每一組彼此堆疊。
復合折線圖也可以稱作堆疊面積圖,堆疊面積圖和基本面積圖一樣,唯一的區別就是圖上每一個數據集的起點不同,起點是基于前一個數據集的,用于顯示每個數值所占大小隨時間或類別變化的趨勢線,展示的是部分與整體的關系。
適用: 堆疊面積圖不適用于表示帶有負值的數據集。非常適用于對比多變量隨時間變化的情況。
分類:
堆積面積圖
同類別各變量和不同類別變量總和差異。百分比堆積面積圖
比較同類別的各個變量的比例差異。
餅形圖
餅圖是圓形統計圖形。為了說明數字比例,將其分為切片。在餅圖中,對于每個切片,其每個弧長都與其代表的數量成正比。中心角和面積也是成比例的。它以切片餡餅命名。餅圖廣泛得應用在各個領域,用于表示不同分類的占比情況,通過弧度大小來對比各種分類。
適用: 適用于比較一個數據分類上各個模塊的大小占比的需求。
注意事項: 餅圖不適用于多分類的數據,原則上一張餅圖不可多于 9 個分類,因為隨著分類的增多,每個切片就會變小,最后導致大小區分不明顯,每個切片看上去都差不多大小,這樣對于數據的對比是沒有什么意義的。所以餅圖不適合用于數據量大且分類很多的場景。
plotly code
import?plotly.express?as?px df?=?px.data.gapminder().query("year?==?2007").query("continent?==?'Europe'") df.loc[df['pop']?<?2.e6,?'country']?=?'Other?countries'? #?Represent?only?large?countries fig?=?px.pie(df,?values='pop',?names='country',title='Population?of?European?continent') fig.show()Seaborn code
Seaborn 沒有創建餅圖的默認函數,但 matplotlib 中的以下語法可用于創建餅圖并添加 seaborn 調色板:
import?matplotlib.pyplot?as?plt import?seaborn?as?snsdata?=?[15,?25,?25,?30,?5] labels?=?['Group?1',?'Group?2',?'Group?3',?'Group?4',?'Group?5']colors?=?sns.color_palette('pastel')[0:5]plt.pie(data,?labels?=?labels,?colors?=?colors,?autopct='%.0f%%') plt.show()這些是餅圖的類型
簡單的餅圖
這是餅圖的基本類型。它通常被稱為餅圖。
爆炸餅圖
圖表的一個或多個扇區與分解餅圖中的圖表分開(稱為分解)。它用于強調數據集中的特定元素。
這是一種以情節方式執行此操作的方法:
import?plotly.graph_objects?as?golabels?=?['Oxygen','Himport?plotly.graph_objects?as?golabels?=?['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen'] values?=?[4500,?2500,?1053,?500]#?拉力是扇形半徑的一個分數 fig?=?go.Figure(data=[go.Pie(labels=labels,?values=values,?pull=[0,?0,?0.2,?0])]) fig.show()seaborn code
在 seaborn 中,matplotlib 中 pie 方法的爆炸屬性可以用作:
import?matplotlib.pyplot?as?plt import?seaborn?as?snsdata?=?[15,?25,?25,?30,?5] labels?=?['Group?1',?'Group?2',?'Group?3',?'Group?4',?'Group?5']colors?=?sns.color_palette('pastel')[0:5]plt.pie(data,?labels?=?labels,?colors?=?colors,?autopct='%.0f%%',?explode?=?[0,?0,?0,?0.2,?0]) plt.show()甜甜圈圖
在這個餅圖中,中心有一個洞。這個洞使它看起來像一個甜甜圈,它的名字由此而來。
甜甜圈圖也可稱為環圖,環圖本質是餅圖將中間區域挖空;環圖相對于餅圖空間的利用率更高,比如我們可以使用它的空心區域顯示文本信息,標題等。
plotly code
import?plotly.graph_objects?as?golabels?=?['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen'] values?=?[4500,?2500,?1053,?500]#?使用“hole”創建一個類似甜甜圈的餅圖 fig?=?go.Figure(data=[go.Pie(labels=labels,?values=values,?hole=.3)]) fig.show()seaborn code
import?numpy?as?np #?import?matplotlib.pyplot?as?plt data?=?np.random.randint(20,?100,?6) plt.pie(data,autopct='%3.1f%%',radius=1,pctdistance=0.85,startangle=90,counterclock=False,#?鍥形塊邊界屬性字典wedgeprops={'edgecolor':?'white','linewidth':?1,'linestyle':?'-'},#?鍥形塊標簽文本和數據標注文本的字體屬性textprops=dict(color='k',??#??字體顏色fontsize=14,family='Arial'???????????????)) circle?=?plt.Circle(?(0,0),?0.7,?color='white') p=plt.gcf() p.gca().add_artist(circle) plt.show()matplotlib code
#?Libraries
import?matplotlib.pyplot?as?plt#?Make?data:?I?have?3?groups?and?7?subgroups
#?設置數據
group_names=['groupA',?'groupB',?'groupC']
group_size=[12,11,30]
subgroup_names=['A.1',?'A.2',?'A.3',?'B.1',?'B.2',?'C.1',?'C.2',?'C.3',?'C.4',?'C.5']
subgroup_size=[4,3,5,6,5,10,5,5,4,6]#?Create?colors
#?設置顏色
a,?b,?c=[plt.cm.Blues,?plt.cm.Reds,?plt.cm.Greens]#?First?Ring?(outside)
#?外圈
fig,?ax?=?plt.subplots()
#?設置等比例軸,x和y軸等比例
ax.axis('equal')
#?畫餅圖
mypie,?_?=?ax.pie(group_size,?radius=1.3,?labels=group_names,?colors=[a(0.6),?b(0.6),?c(0.6)],wedgeprops=dict(width=0.3,?edgecolor='white'));#?Second?Ring?(Inside)
#?畫第二個圓
mypie2,?_?=?ax.pie(subgroup_size,?radius=1.3-0.3,?labels=subgroup_names,?labeldistance=0.7,?colors=[a(0.5),?a(0.4),?a(0.3),?b(0.5),?b(0.4),?c(0.6),?c(0.5),?c(0.4),?c(0.3),?c(0.2)],wedgeprops=dict(width=0.4,?edgecolor='white'));plt.margins(0,0);字母符合餅圖
餅圖是一種圖表,它生成一個全新的餅圖,詳細說明現有餅圖的一小部分。它可用于減少混亂并強調一組特定的元素。
import?matplotlib?as?mpl import?matplotlib.pyplot?as?plt from?matplotlib.patches?import?ConnectionPatch #?使圖表元素中正常顯示中文 mpl.rcParams['font.sans-serif']?=?'SimHei' #?使坐標軸刻度標簽正常顯示負號 mpl.rcParams['axes.unicode_minus']?=?False#?畫布 fig?=?plt.figure(figsize=(12,?6), #??????????????????facecolor='cornsilk') ax1?=?fig.add_subplot(121) ax2?=?fig.add_subplot(122) fig.subplots_adjust(wspace=0)#?定義數據 data?=?{'category':?['name1',?'name2',?'name3',?'name4',?'name5'],'quantity':?[138,?181,?118,?107,?387]}others?=?{'category':?['name1',?'name2',?'name3',?],'quantity':?[98,?170,?119]}#?大餅圖 labs?=?data['category'] quantity?=?data['quantity'] explode?=?(0,?0,?0,?0,?0.03)????#?分裂距離ax1.pie(x=quantity,colors=['r',?'g',?'m',?'c',?'y'],explode=explode,?autopct='%1.1f%%',startangle=70,?labels=labs,textprops={'color':?'k',?'fontsize':?12,})#?小餅圖 labs2?=?others['category'] quantity_2?=?others['quantity']ax2.pie(x=quantity_2,colors=['khaki',?'olive',?'gold'],autopct='%1.1f%%',?startangle=70,labels=labs2,?radius=0.5,shadow=True,?textprops={'color':?'k','fontsize':?12,?},?)#?用?ConnectionPatch?畫出兩個餅圖的間連線 ##?餅圖邊緣的數據 theta1?=?ax1.patches[-1].theta1 theta2?=?ax1.patches[-1].theta2 center?=?ax1.patches[-1].center r?=?ax1.patches[-1].rwidth=0.2 #?上邊緣的連線 x?=?r*np.cos(np.pi/180*theta2)+center[0] y?=?np.sin(np.pi/180*theta2)+center[1] con_a?=?ConnectionPatch(xyA=(-width/2,0.5),?xyB=(x,y),coordsA='data',?coordsB='data',axesA=ax2,?axesB=ax1?)#?下邊緣的連線 x?=?r*np.cos(np.pi/180*theta1)+center[0] y?=?np.sin(np.pi/180*theta1)+center[1] con_b?=?ConnectionPatch(xyA=(-width/2,-0.5),xyB=(x,y),?coordsA='data',coordsB='data',??axesA=ax2,axesB=ax1?)for?con?in?[con_a,?con_b]:con.set_linewidth(1)????#?連線寬度con.set_color=([0,0,0])?#?連線顏色ax2.add_artist(con)?????#?添加連線3D 餅圖
這是在 3 維空間中表示的餅圖。
可以將 shadow 屬性設置為 True 以在 seaborn / matplotlib 中執行此操作。
import?matplotlib.pyplot?as?plt labels?=?['Python',?'C++',?'Ruby',?'Java'] sizes?=?[215,?130,?245,?210] #?Plot plt.pie(sizes,?labels=labels,?autopct='%1.1f%%',?shadow=True,?startangle=140) plt.axis('equal') plt.show()特殊的餅圖
fig,?ax?=?plt.subplots(figsize=(6,?6),?subplot_kw={'projection':'polar'})
data?=?80
startangle?=?90
x?=?(data?*?np.pi?*?2)/?100
left?=?(startangle?*?np.pi?*?2)?/?360?#?轉換起始角度
ax.barh(1,?x,?left=left,?height=1,color='#5DADE2')
plt.ylim(-3,?3)直方圖
直方圖是數值數據分布的近似表示。直方圖,又稱質量分布圖,是一種統計報告圖,由一系列高度不等的縱向條紋或線段表示數據分布的情況。
數據被劃分為不重疊的區間,稱為箱和桶。一個矩形豎立在一個 bin 上,其高度與 bin 中的數據點數量成正比。直方圖給人一種底層數據分布密度的感覺。
適用: 直方圖是以矩形的長度表示每一組的頻數或數量,寬度則表示各組的組距,因此其高度與寬度均有意義,利于展示大量數據集的統計結果。
plotly code
import?plotly.express?as?px df?=?px.data.tips() fig?=?px.histogram(df,?x="total_bill") fig.show()seaborn code
import?seaborn?as?sns sns.set_context({'figure.figsize':[12,?8]}) penguins?=?sns.load_dataset("penguins") ax?=?sns.histplot(data=penguins,?x="flipper_length_mm") ax.xaxis.label.set_size(15) ax.yaxis.label.set_size(15)它根據其分布分為以下不同部分:
正態分布
這個圖表通常是鐘形的。
雙峰分布
在這個直方圖中,有兩組呈正態分布的直方圖。它是在數據集中組合兩個變量的結果。
plotly code
import?plotly.express?as?px df?=?px.data.tips() fig?=?px.histogram(df,?x="total_bill",?y="tip",?color="sex",?marginal="rug",hover_data=df.columns) fig.show()seaborn code
import?seaborn?as?sns iris?=?sns.load_dataset("iris") sns.kdeplot(data=iris)偏態分布
這是一個具有偏心峰的不對稱圖。峰值趨向于圖形的開頭或結尾。直方圖可以說是右偏還是左偏,這取決于峰值趨向于哪個方向。
隨機分布
此直方圖沒有規則模式。它產生多個峰。它可以稱為多峰分布。
邊緣峰值分布
這種分布類似于正態分布,除了在其一端有一個大峰。
梳狀分布
梳狀分布就像一個梳子。矩形條的高度高低交替。
面積圖
它由線和軸之間的區域表示。面積與其代表的數量成正比。
這些是面積圖的類型:
簡單面積圖
I在此圖表中,彩色段彼此重疊。它們被放置在彼此之上。
堆積面積圖
在此圖表中,彩色段彼此堆疊在一起。因此它們不相交。
100% 堆積面積圖
在此圖表中,每組數據所占的面積以占總數據量的百分比來衡量。通常,縱軸總計為 100%。
3-D 面積圖
此圖表是在 3 維空間上測量的。將在下面展示最常見類型的視覺表示和代碼。
Plotly code
import?plotly.express?as?px df?=?px.data.gapminder() fig?=?px.area(df,?x="year",?y="pop",?color="continent",line_group="country") fig.show()Seaborn code
import?pandas?as?pd import?matplotlib.pyplot?as?plt import?seaborn?as?sns sns.set_context({'figure.figsize':[15,?8]}) sns.set_theme()df?=?pd.DataFrame({'period':?[1,?2,?3,?4,?5,?6,?7,?8],'team_A':?[20,?12,?15,?14,?19,?23,?25,?29],'team_B':?[5,?7,?7,?9,?12,?9,?9,?4],'team_C':?[11,?8,?10,?6,?6,?5,?9,?12]})plt.stackplot(df.period,?df.team_A,?df.team_B,?df.team_C)點陣圖
點圖由在圖形上繪制為點的數據點組成。
這些有兩種類型:
威爾金森點圖
在這個點圖中,局部位移用于防止圖上的點重疊。
克利夫蘭點圖
這是一個類似散點圖的圖表,在一個維度中垂直顯示數據。
plotly code
import?plotly.express?as?px df?=?px.data.medals_long()fig?=?px.scatter(df,?y="nation",?x="count",color="medal",?symbol="medal") fig.update_traces(marker_size=10) fig.show()seaborn code
import?seaborn?as?sns sns.set_context({'figure.figsize':[15,?8]}) sns.set_theme(style="whitegrid") tips?=?sns.load_dataset("tips") ax?=?sns.stripplot(x="day",y="total_bill",?data=tips)散點圖
它是一種使用笛卡爾坐標顯示一組數據的兩個變量的值的圖。它顯示為點的集合。它們在水平軸上的位置決定了一個變量的值。垂直軸上的位置決定了另一個變量的值。當一個變量可以控制而另一個變量依賴于它時,可以使用散點圖。當兩個連續變量獨立時也可以使用它。
散點圖也叫 X-Y 圖,它將所有的數據以點的形式展現在直角坐標系上,以顯示變量之間的相互影響程度,點的位置由變量的數值決定。通過觀察散點圖上數據點的分布情況,我們可以推斷出變量間的相關性;
適用: 適用于相關性分析,比如回歸分析。
Plotly code
import?plotly.express?as?px df?=?px.data.iris()?#?iris?is?a?pandas?DataFrame fig?=?px.scatter(df,?x="sepal_width",?y="sepal_length") fig.show()Seaborn code
import?seaborn?as?sns tips?=?sns.load_dataset("tips") sns.scatterplot(data=tips,?x="total_bill",?y="tip")根據數據點的相關性,散點圖分為不同的類型。下面列出了這些關聯類型
正相關
在這些類型的圖中,自變量的增加表示依賴于它的變量的增加。散點圖可以具有高正相關或低正相關。
負相關關系
在這些類型的圖中,自變量的增加表明依賴于它的變量減少。散點圖可以具有高或低的負相關。
無相關性
如果在散點圖上顯示的兩組數據之間沒有明顯的相關性,則認為它們不相關。
氣泡圖
氣泡圖顯示數據的三個屬性。它們由 x 位置、y 位置和氣泡的大小表示。氣泡圖是一種多變量圖表,是散點圖的變體,也可以認為是散點圖和百分比區域圖的組合。
適用: 適用于分類數據對比,相關性分析。
注意事項: 氣泡圖的數據大小容量有限,氣泡太多會使圖表難以閱讀。但是可以通過增加一些交互行為彌補:隱藏一些信息,當鼠標點擊或者懸浮時顯示,或者添加一個選項用于重組或者過濾分組類別。另外,氣泡的大小是映射到面積而不是半徑或者直徑繪制的。因為如果是基于半徑或者直徑的話,圓的大小不僅會呈指數級變化,而且還會導致視覺誤差。
Plotly code
import?plotly.express?as?px df?=?px.data.gapminder()fig?=?px.scatter(df.query("year==2007"),?x="gdpPercap",?y="lifeExp",size="pop",?color="continent",hover_name="country",?log_x=True,?size_max=60) fig.show()Seaborn code
import?matplotlib.pyplot?as?plt import?seaborn?as?sns from?gapminder?import?gapminder?#?import?data?set? data?=?gapminder.loc[gapminder.year?==?2007]b?=?sns.scatterplot(data=data,?x="gdpPercap",?y="lifeExp",?size="pop",?legend=False,?sizes=(20,?2000))b.set(xscale="log") plt.show()它們根據數據集中變量的數量、可視化數據的類型以及其中的維數將它們分為不同的類型。
簡單氣泡圖
它是氣泡圖的基本類型,相當于普通氣泡圖。
帶標簽的氣泡圖
此氣泡圖上的氣泡已標記,以便于識別。這是為了處理不同的數據組。
多變量氣泡圖
此圖表有四個數據集變量。第四個變量用不同的顏色區分。
地圖氣泡圖
它用于說明地圖上的數據。
3D 氣泡圖
這是在 3 維空間中設計的氣泡圖。這里的氣泡是球形的。
雷達圖
它是一個圖形顯示數據,由許多自變量組成。它顯示為三個或更多定量變量的二維圖表。這些變量顯示在從同一點開始的軸上。
Plotly code
import?plotly.express?as?px import?pandas?as?pd df?=?pd.DataFrame(dict(r=[1,?5,?2,?2,?3],theta=['processing?cost','mechanical?properties','chemical?stability','thermal?stability',?'device?integration'])) fig?=?px.line_polar(df,?r='r',?theta='theta',?line_close=True) fig.show()Seaborn code
import?pandas?as?pd import?seaborn?as?sns import?numpy?as?np import?matplotlib.pyplot?as?plt stats=np.array([1,?5,?2,?2,?3]) labels=['processing?cost','mechanical?properties','chemical?stability','thermal?stability',?'device?integration'] angles=np.linspace(0,?2*np.pi,?len(labels),?endpoint=False) fig=plt.figure() ax?=?fig.add_subplot(111,?polar=True) ax.plot(angles,?stats,?'o-',?linewidth=2) ax.fill(angles,?stats,?alpha=0.25) ax.set_thetagrids(angles?*?180/np.pi,?labels) ax.set_title("Radar?Chart") ax.grid(True)這些是雷達圖的類型:
簡單的雷達圖
這是雷達圖的基本類型。它由從中心點繪制的幾個半徑組成。
帶標記的雷達圖
在這些中,蜘蛛圖上的每個數據點都被標記。
填充雷達圖
在填充的雷達圖中,線條和蜘蛛網中心之間的空間是彩色的。
象形圖
它使用圖標來提供一小組離散數據的更具吸引力的整體視圖。圖標代表基礎數據的主題或類別。例如,人口數據將使用人的圖標。每個圖標可以代表一個或多個(例如一百萬)個單位。數據的并排比較在圖標的列或行中完成。這是為了將每個類別相互比較。
plotly code
在 plotly 中,標記符號可以與 graph_objs Scatter 一起使用。
import?plotly.graph_objs?as?go from?plotly.offline?import?iplot,?init_notebook_mode init_notebook_mode() from?IPython.display?import?display,HTML import?pandas?as?pd?title?=?'Team?scores'ds?=?pd.Series({'Alpha'?:?67,?'Bravo'?:?30,?'Charlie'?:?20,?'Delta':?12,?'Echo':?23,?'Foxtrot':?56})print(sum(ds))Xlim?=?16 Ylim?=?13 Xpos?=?0 Ypos?=?12?##change?to?zero?for?upwards series?=?[] for?name,?count?in?ds.iteritems():x?=?[]y?=?[]for?j?in?range(0,?count):if?Xpos?==?Xlim:Xpos?=?0Ypos?-=?1?##change?to?positive?for?upwardsx.append(Xpos)y.append(Ypos)Xpos?+=?1series.append(go.Scatter(x=x,?y=y,?mode='markers',?marker={'symbol':?'square',?'size':?15},?name=f'{name}?({count})'))fig?=?go.Figure(dict(data=series,?layout=go.Layout(title={'text':?title,?'x':?0.5,?'xanchor':?'center'},paper_bgcolor='rgba(255,255,255,1)',plot_bgcolor='rgba(0,0,0,0)',xaxis=dict(showgrid=False,zeroline=?False,?showline=False,?visible=False,?showticklabels=False),yaxis=dict(showgrid=False,zeroline=?False,?showline=False,?visible=False,?showticklabels=False), ))) fig.show()matplotlib code
在 matplotlib 的 figure 方法中可以使用圖標屬性。
from?pywaffle?import?Waffle import?matplotlib.pyplot?as?plt plt.figure(figsize=(15,8)) dict_users?=?{'Regular':?62,?'New':?20,?'Churned':?16,?'Suspended':?2} df?=?pd.Series(dict_users) colors_list?=?['slateblue',?'limegreen',?'red',?'grey'] colors?=?{df.index[i]:colors_list[i]?for?i?in?range(len(df))}fig?=?plt.figure(FigureClass=Waffle,figsize=(10,5),values=dict_users,rows=10,colors=list(colors.values()),icons=['user','user-plus',?'user-minus',?'user-clock'],font_size=22,icon_legend=True,legend={'bbox_to_anchor':?(1.55,?1),?'fontsize':?15,?'frameon':?False}) plt.title('User?dynamics?in?December?2021',?fontsize=25) plt.show()樣條圖
樣條圖是折線圖的一種。它將系列中的每個數據點與表示缺失數據點的粗略近似值的擬合曲線連接起來。
plotly code
在 plotly 中,它是通過將 line_shape 指定為 spline 來實現的。
import?plotly.express?as?px df?=?px.data.gapminder().query("country=='Canada'") fig?=?px.line(df,?x="year",?y="lifeExp",?title='Life?expectancy?in?Canada',?line_shape?=?'spline') fig.show()Scipy code
Scipy 插值和 NumPy linspace 可用于在 matplotlib 中實現這一點。
from?scipy?import?interpolate import?numpy?as?np import?matplotlib.pyplot?as?plt fig,?ax?=?plt.subplots(1,2,figsize=(15,7)) x?=?np.array([1,?2,?3,?4]) y?=?np.array([75,?0,?25,?100]) ax[0].plot(x,?y)x_new?=?np.linspace(1,?4,?300) a_BSpline?=?interpolate.make_interp_spline(x,?y) y_new?=?a_BSpline(x_new)ax[1].plot(x_new,?y_new)箱形圖
箱線圖是查看數據分布方式的好方法。
顧名思義,它有一個盒子。盒子的一端位于數據的第 25個百分位。第25個百分位數是繪制的線,其中 25% 的數據點位于其下方。盒子的另一端位于第 75個百分位數(其定義類似于第 25個百分位數)百分位如上)。數據的中位數由一條線標記。還有兩條額外的線,稱為須線。
第 25 個百分位標記稱為“Q1”(代表數據的第一季度)。第 75 個百分點是 Q3。Q3 和 Q1 (Q3 – Q1) 之間的差異是 IQR(四分位距)。在 Q1 – 1.5 * IQR 和 Q3 + 1.5 * IQR的極端范圍內任一側的最后數據點處標記了晶須。這些須線之外的數據點被稱為“異常值”,因為它們與其余數據點有顯著差異。
箱形圖又稱盒須圖、盒式圖或箱線圖,是利用數據中的五個統計量:最小值、第一四分位數、中位數、第三四分位數與最大值來顯示一組數據分布情況的統計圖。
適用: 適用于展示一組數據分散情況,特別用于對幾個樣本的比較。
plotly code
import?numpy?as?np? import?plotly.express?as?px data?=?np.array([-40,1,2,5,10,13,15,16,17,40]) fig?=?px.box(data,?points="all") fig.show()Seaborn code
import?seaborn?as?sns sns.set_style(?'darkgrid'?) fig?=?sns.boxplot(y=data)箱線圖有助于理解數據的整體分布,即使是大型數據集也是如此。
小提琴圖
一般來說,小提琴圖是一種繪制連續型數據的方法,可以認為是箱形圖與核密度圖的結合體。當然了,在小提琴圖中,我們可以獲取與箱形圖中相同的信息。
中位數(小提琴圖上的一個白點)
四分位數范圍(小提琴中心的黑色條)。
較低/較高的相鄰值(黑色條形圖)--分別定義為第一四分位數-1.5 IQR和第三四分位數+1.5 IQR。這些值可用于簡單的離群值檢測技術,即位于這些 "柵欄"之外的值可被視為離群值。
plotly code
import?plotly.express?as?px df?=?px.data.tips() fig?=?px.violin(df,?y="total_bill",?x="day",?color="sex",?box=True,?points="all",hover_data=df.columns) fig.show()Seaborn code
import?seaborn?as?sns sns.set_context({'figure.figsize':[15,?8]}) sns.set_theme(style="whitegrid") tips?=?sns.load_dataset("tips") ax?=?sns.violinplot(x="day",?y="total_bill",?hue="sex",?data=tips)matplotlib code
import?numpy?as?np import?matplotlib.pyplot?as?plt import?seaborn?as?sns N?=?10**4 x?=?np.random.normal(size=N) fig,?ax?=?plt.subplots(3,?1,figsize=(15,8),?sharex=True) sns.distplot(x,?ax=ax[0]) ax[0].set_title('Histogram?+?KDE') sns.boxplot(x,?ax=ax[1]) ax[1].set_title('Boxplot') sns.violinplot(x,?ax=ax[2]) ax[2].set_title('Violin?plot') fig.suptitle('Standard?Normal?Distribution',?fontsize=16) plt.show()總結
這是用于生成這些圖的 plotly 和 seaborn 中方法和屬性的備忘單。
| Simple bar graph | express bar | barplot |
| Grouped bar graph | color attribute and barmode=’group’ | hue attribute |
| Stacked bar graph | color attribute | label and color attributes with multiple plots |
| Simple line graph | express line | lineplot |
| Multiple line graph | color and symbol attributes | hue attribute |
| Simple pie chart | express pie | matplotlib.pyplot.pie |
| Exploded pie chart | graph_objects Pie with pull attribute | explode attribute |
| Donut chart | graph_objects Pie with hole attribute | Add matplotlib.pyplot.Circle |
| 3D pie chart | Use pygooglechart package | shadow attribute |
| Normal histogram | express histogram | histplot |
| Bimodal histogram | color attribute | kdeplot |
| Area chart | express area | matplotlib.pyplot.stackplot |
| Dot graph | express scatter | stripplot |
| Scatter plot | express scatter | scatterplot |
| Bubble chart | express scatter with color and size attributes | scatterplot with size attribute |
| Radar chart | express line_polar | matplotlib.pyplot figure |
| Pictogram | graph_objects Figure having Scatter with marker attribute | matplotlib.pyplot figure with pywaffle package |
| Spline chart | express line with line_shape=’spline’ | Scipy.interpolate.make_interp_spline |
| Box plot | express box | boxplot |
| Violin Plot | express violin | violinplot |
寫在最后
我們看了各種各樣的可視化圖,知道了何時使用哪些圖表。我們一起學習了 plotly 和 seaborn 中的代碼來生成這些圖。為了更好地理解,介紹了在 plotly 和 seaborn 中使用哪些方法和屬性來生成這些圖。
現在我們已經掌握了這些工具、技術和技巧。記得給云朵君點個贊和在看吧。
各位伙伴們好,詹帥本帥搭建了一個個人博客和小程序,匯集各種干貨和資源,也方便大家閱讀,感興趣的小伙伴請移步小程序體驗一下哦!(歡迎提建議)推薦閱讀牛逼!Python常用數據類型的基本操作(長文系列第①篇) 牛逼!Python的判斷、循環和各種表達式(長文系列第②篇)牛逼!Python函數和文件操作(長文系列第③篇)牛逼!Python錯誤、異常和模塊(長文系列第④篇) 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Python中最常用的 14 种数据可视化类型的概念与代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐10个好用到爆的Jupyter No
- 下一篇: Python可视化 | Matplotl