R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)
寫在前面:為啥不用excel繪制這些圖,用PoweBI,帆軟BI等可視化軟件來繪圖,不是更方便嗎?的確,這些工具都很方便,但同時,它們顯得很呆,不夠靈活,更為致命的是,它們繪制出的圖形,分辨率不夠,用來出版論文,是不合格的。所以,要做學術的朋友,對R,Python可視化繪圖感興趣的朋友,不妨下點功夫將這些技術學到手。
我之所以,將自己花費4個晚上,8個小時整理出來的文檔分享出來,無非是為了減少大家學習技術的時間,我深知入門一種語言的艱辛,因為我在學習的時候,也是網上各種找資料,一個軟件下載安裝完畢,花費大半天的時間,當初學習一門語言的激情都走了大半;所以,希望大家能夠快速上手,將時間花費在能真正提高技術的地方,比如設置圖形的顏色,寬度,線條,靈活的修改圖形等方面,這也是我接下來要研究的。
看在我這么辛苦的份上,看完不妨點個贊。。。文章最后放本文所需要的軟件安裝過程鏈接,用R與Python繪制中國地圖,某省地圖,以及可視化技術的介紹。。。
本文要繪制的圖形以及如何使用這些圖形:散點圖、折線圖、直方圖、條形圖、箱線圖、餅圖、熱力圖、蜘蛛圖、二元變量分布和成對關系。
用R繪圖
軟件:w10版Rstudio
條形圖通過垂直的或水平的條形展示了類別型變量的分布(頻數)。
> install.packages("vcd") > library(vcd) > counts<-table(Arthritis$Improved) > countsNone Some Marked 42 14 28 > barplot(counts,main="簡單的條形圖",xlab="Improvement",ylab="Frequency")?
> counts<-table(Arthritis$Improved,Arthritis$Treatment) > countsPlacebo TreatedNone 29 13Some 7 7Marked 7 21> plot(counts,main="堆砌條形圖",xlab="Treatment",ylab="Frequency",col=c("red","yellow","green"))> barplot(counts,main="堆砌條形圖",xlab="Treatment",ylab="Frequency",col=c("red","yellow","green"),legend=rownames(counts))> barplot(counts,main="分組條形圖",xlab="Treatment",ylab="Frequency",col=c("red","yellow","green"),beside=T,legend=rownames(counts))> states<-data.frame(state.region,state.x77) > means<-aggregate(states$Illiteracy,by=list(state.region),FUN=mean) > means<-means[order(means$x),] > barplot(means$x,names.arg=means$Group.1) > title("均值條形圖")使用中注意:我用plot()與barplot()繪制的堆砌條形圖并不一樣!!!要想使得條形圖“橫著放”,barplot()函數中加上horiz=T
在繪圖堆砌條形圖時,使用table()函數將數據表格化,之所以使用table()是為了防止類別型變量不是因子,本例中Arthritis$Improved是一個因子。
?
散點圖的英文叫做 scatter plot,它將兩個變量的值顯示在二維坐標中,非常適合展示兩個變量之間的關系。
> x<-rnorm(100) > y<-2*x+rnorm(100) > plot(x,y,main="Linearly correlated random numbers",xlab="x",ylab="2*x+noise",xlim=c(-4,4),ylim=c(-4,4)) > plot(0:25,0:25,pch=0:25,xlim=c(-1,26),ylim=c(-1,26),main="point stytles (pch)") > text(0:25+1,0:25,0:25)?
> plot(x,y,pch=ifelse(x*y>1,16,1),main="scatter plot with conditional point styles") > z<-sqrt(1+x^2)+rnorm(100) > plot(x,y,pch=1,xlim=range(x),ylim=range(y,z),xlab="x",ylab="values") > points(x,z,pch=17) > title("scatter plot with two series")R語言有向量(python中沒有),pch是向量,控制點的類型。col也是向量,控制點的顏色
> plot(x,y,pch=16,col="blue",main="scatter plot with blue points") > plot(x,y,pch=16,col=ifelse(y>=mean(y),"red","green"),main="scatter plot with conditional colors")有沒有一幅圖中顯示x,y的關系,x,z的相關關系了?(看我這么貼心,你們要是不點贊收藏,好好看都對不起我)
> plot(x,y,pch=16,col=ifelse(y>=mean(y),"red","green"),main="scatter plot with conditional colors") > plot(x,y,col="blue",pch=0,xlim=range(x),ylim=range(y,z),xlab="x",ylab="value") > points(x,z,col="red",pch=1) > title("scatter plot with two series") > t<-1:50 > y<-3*sin(t*pi/60)+rnorm(t) > plot(t,y,type="l",main="single line plot") > lty_values<-1:6 > plot(lty_values,type="n",axes=F,ann=F) > abline(h=lty_values,lty=lty_values,lwd=2) > mtext(lty_values,side=2,at=lty_values) > title("line types (lty)")?
> p<-40 > plot(t[t<=p],y[t<=p],col="red",type="l",xlim=range(t),xlab="t") > lines(t[t>=p],y[t>=p],col="blue",lty=2)> plot(y,type="l") > points(y,pch=16)?
> x<-1:30 > y<-2*x+6*rnorm(30) > z<-3*sqrt(x)+8*rnorm(30) > plot(x,y,type="l",ylim=range(y,z),col="black") > points(y,pch=15) > lines(z,lty=2,col="blue") > points(z,pch=16,col="blue") > title("plot of two series") > legend("topleft",legend=c("y","z"),col=c("black","blue"),lty=c(1,2),pch=c(15,16),cex=0.8,x.intersp = 0.5,y.intersp=0.8) > barplot(1:10,names.arg =LETTERS[1:10])> data("flights",package="nycflights13") > carriers<-table(flights $carrier) > sorted_carriers<-sort(carriers,decreasing=T) > barplot(head(sorted_carriers,8),ylim=c(0,max(sorted_carriers)*1.1),xlab="carrier",ylab="flights",main="top 8 carriers with the most flights in record") > hist(flight_speed,probability = T,ylim=c(0,0.5),main="Histogram and empirical distribution of flight speed",border="gray",col="lightgray") > lines(density(flight_speed,from=2,na.rm=T),col="darkgray",lwd=2) > abline(v=mean(flight_speed,na.rm=T,col="blue",lty=2)) Hist():畫出flight_speed的柱狀圖 Density():估計飛行速度的經驗分布,并在上面繪制光滑的概率分布曲線 Abline():繪制飛行速度的平均水平線 > grades<-c(A=2,B=10,C=12,D=8) > pie(grades,main="Grades",radius=1) boxplot(distance/air_time~carrier,data=flights,main="box plot of light speed by carrier")散點圖矩陣&氣泡圖
散點圖矩陣:可以看到線性和平滑(loess)擬合曲線被默認添加,主對角線處添加了核密度曲 線和軸須圖。spread = FALSE選項表示不添加展示分散度和對稱信息的直線,lty.smooth = 2設定平滑(loess)擬合曲線使用虛線而不是實線。?
氣泡圖:我們避免用三維散點圖的表達;先創建一個二維散點圖,第三個變量用氣泡大小表示。
你可用symbols()函數來創建氣泡圖。該函數可以在指定的(x, y)坐標上繪制圓圈圖、方形 圖、星形圖、溫度計圖和箱線圖。以繪制圓圈圖為例: symbols(x,y,circle=radius);x,y表示坐標,circle表示圓半徑。如果你想要用面積而不是半徑來表示第三個變量,(r=sqrt(s/pi)?)變 換即可:?
?在氣泡圖中,x軸代表車重,y軸代表每加侖英里數,氣泡大 小代表發動機排量
Python繪圖
軟件環境:
如果說通過直方圖可以看到變量的數值分布,那么條形圖可以幫我們查看類別的特征。在條形圖中,長條形的長度表示類別的頻數,寬度表示類別。
在 Matplotlib 中,我們使用 plt.bar(x, height) 函數,其中參數 x?代表 x 軸的位置序列,height 是 y 軸的數值序列
在 Seaborn 中,我們使用 sns.barplot(x=None, y=None, data=None) 函數,參數 data 為 DataFrame 類型,x、y 是 data 中的變量。
import matplotlib.pyplot as plt import seaborn as sns# 數據準備 x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5'] y = [5, 4, 8, 12, 7] # 用 Matplotlib 畫條形圖 plt.bar(x, y) print (plt.show()) # 用 Seaborn 畫條形圖 sns.barplot(x, y) print (plt.show())散點圖
畫散點圖,需要使用 plt.scatter(x, y, marker=None) 函數。marker 代表了標記的符號。比如“x”、“>”或者“o”。
除了 Matplotlib 外,你也可以使用 Seaborn 進行散點圖的繪制。使用 sns.jointplot(x, y, data=None, kind=‘scatter’) 函數,data 就是我們要傳入的數據,一般是 DataFrame 類型;kind 這類我們取 scatter,代表散點的意思
import numpy as np import pandas as pd # 數據準備 N = 1000 x = np.random.randn(N) y = np.random.randn(N) # 用 Matplotlib 畫散點圖 plt.scatter(x, y,marker='x') plt.show() # 用 Seaborn 畫散點圖 df = pd.DataFrame({'x': x, 'y': y}) sns.jointplot(x="x", y="y", data=df, kind='scatter'); plt.show()折線圖可以用來表示數據隨著時間變化的趨勢。
在 Matplotlib 中,我們可以直接使用 plt.plot() 函數,當然需要提前把數據按照 x 軸的大小進行排序,要不畫出來的折線圖就無法按照?x 軸遞增的順序展示。
在 Seaborn 中,我們使用 sns.lineplot (x, y, data=None) 函數,data 就是我們要傳入的數據,一般是 DataFrame 類型。
# 數據準備 x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019] y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35] # 使用 Matplotlib 畫折線圖 plt.plot(x, y) plt.show() # 使用 Seaborn 畫折線圖 df = pd.DataFrame({'x': x, 'y': y}) sns.lineplot(x="x", y="y", data=df) plt.show()直方圖是比較常見的視圖;
在 Matplotlib 中,我們使用 plt.hist(x, bins=10) 函數,其中參數 x 是一維數組,bins 代表直方圖中的箱子數量,默認是 10。
在 Seaborn 中,我們使用 sns.distplot(x, bins=10, kde=True) 函數。參數 x 是一維數組,bins 代表直方圖中的箱子數量,kde 代表顯示核密度估計,默認是 True.核密度估計是通過核函數幫我們來估計概率密度的方法。
# 數據準備 a = np.random.randn(100) s = pd.Series(a) # 用 Matplotlib 畫直方圖 plt.hist(s) plt.show() # 用 Seaborn 畫直方圖 sns.distplot(s, kde=False) plt.show() sns.distplot(s, kde=True) plt.show()餅圖餅圖是常用的統計學模塊,可以顯示每個部分大小與總和之間的比例。在 Matplotlib 中,我們使用 plt.pie(x, labels=None) 函數,其中參數 x 代表要繪制餅圖的數據,labels 是缺省值,可以為餅圖添加標簽。
# 數據準備 nums = [25, 37, 33, 37, 6] labels = ['High-school','Bachelor','Master','Ph.d', 'Others'] # 用 Matplotlib 畫餅圖 plt.pie(x = nums, labels=labels) plt.show()箱線圖,又稱盒式圖,它是在 1977 年提出的,由五個數值點組成:最大值 (max)、最小值 (min)、中位數 (median) 和上下四分位數;它可以幫我們分析出數據的差異性、離散程度和異常值等。
在 Matplotlib 中,我們使用 plt.boxplot(x, labels=None) 函數
在 Seaborn 中,我們使用 sns.boxplot(x=None, y=None, data=None) 函數;參數 data 為 DataFrame 類型,x、y 是 data 中的變量。
# 數據準備 # 生成 0-1 之間的 10*4 維度數據 data=np.random.normal(size=(10,4)) lables = ['A','B','C','D'] # 用 Matplotlib 畫箱線圖 plt.boxplot(data,labels=lables) plt.show() # 用 Seaborn 畫箱線圖 df = pd.DataFrame(data, columns=lables) sns.boxplot(data=df) plt.show()熱力圖是一種非常直觀的多元變量分析方法。
我們一般使用 Seaborn 中的 sns.heatmap(data) 函數,其中 data 代表需要繪制的熱力圖數據。
# 數據準備 flights = sns.load_dataset("flights") data=flights.pivot('year','month','passengers') # 用 Seaborn 畫熱力圖 sns.heatmap(data) plt.show()蜘蛛圖
蜘蛛圖是一種顯示一對多關系的方法。在蜘蛛圖中,一個變量相對于另一個變量的顯著性是清晰可見的。假設我們想要給王者榮耀的玩家做一個戰力圖,指標一共包括推進、KDA、生存、團戰、發育和輸出。那該如何做呢?
這里我們需要使用 Matplotlib 來進行畫圖,首先設置兩個數組:labels 和 stats。他們分別保存了這些屬性的名稱和屬性值。
因為需要計算角度,所以我們要準備 angles 數組;又因為需要設定統計結果的數值,所以我們要設定 stats 數組。并且需要在原有 angles 和 stats 數組上增加一位,也就是添加數組的第一個元素。
代碼中 flt.figure 是創建一個空白的 figure 對象---畫幕布?;add_subplot(111) 可以把畫板劃分成 1 行 1 列;
再用 ax.plot 和 ax.fill 進行連線以及給圖形上色。
Matplotlib 對中文的顯示不是很友好,我在網上下載了中文字體;(記得記載包from matplotlib.font_manager import FontProperties
,否則報錯!!!)
散點圖,核密度圖,Hexbin 圖
如果我們想要看兩個變量之間的關系,就需要用到二元變量分布。散點圖就是一種二元變量分布。
在 Seaborn 里,使用二元變量分布是非常方便的,直接使用 sns.jointplot(x, y, data=None, kind) 函數即可。其中用 kind 表示不同的視圖類型:“kind=‘scatter’”代表散點圖,“kind=‘kde’”代表核密度圖,“kind=‘hex’”代表 Hexbin 圖,它代表的是直方圖的二維模擬。
# 數據準備 tips = sns.load_dataset("tips") print(tips.head(10)) # 用 Seaborn 畫二元變量分布圖(散點圖,核密度圖,Hexbin 圖) sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter') sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde') sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex') plt.show()散點圖矩陣
如果想要探索數據集中的多個成對雙變量的分布,可以直接采用 sns.pairplot() 函數。它可以說是探索性分析中的常用函數,可以很快幫我們理解變量對之間的關系。
pairplot 函數的使用,就像在 DataFrame 中使用 describe() 函數一樣方便!!!
在這里,直接使用anaconda自帶包中的數據;
# 數據準備 iris = sns.load_dataset('iris') # 用 Seaborn 畫成對關系 sns.pairplot(iris) plt.show()如何描述這幅圖:只看右上角就行,(與左下角對稱)橫軸找一個變量,縱軸找一個變量,圖形就顯示二者間的相關關系。
總結:?Python 可視化工具包 Matplotlib 和 Seaborn 工具就好比?NumPy 和 Pandas 的關系。Seaborn 是基于 Matplotlib 更加高級的可視化庫。
如果你想設置修改顏色、寬度等視圖屬性。你可以看之后,我寫的文檔(相信我一定會放的,畢竟在學習的路上,不能停)。也可以在網上自己學習相關函數文檔。
“老弟,來了”。能看到這里,我為你手動點個贊,感謝大家。
可視化技術:https://www.zhihu.com/people/wu-shu-cheng-12/answers
用PYTHON繪制中國地圖VS用R繪制中國地圖:https://blog.csdn.net/qiu_zhi_liao/article/details/85564131
R就使用Rstudio,安裝起來非常方便,快速,一個輕量型的R可以做到如此貼心的地步,默默為R點個贊。(切記,先裝R,再Rstudio)
https://www.zhihu.com/question/63466456/answer/432176729
PYTHON的話建議使用Anaconda:因為它很大,庫很多,一旦下載,方便新手操作!(500多M的樣子)
- Anaconda 安裝管理:https://www.zhihu.com/collection/236101838
- Jupyter notebook 安裝管理:https://www.zhihu.com/collection/236101838
總結
以上是生活随笔為你收集整理的R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据分析思维框架---认知决定差异
- 下一篇: pycharm使用import nump