06. Matplotlib 2 |折線圖| 柱狀圖| 堆疊圖| 面積圖| 填圖| 餅圖| 直方圖| 散點圖| 極坐標| 圖箱型圖


 

1.基本圖表繪制 plt.plot()

圖表類別:線形圖、柱狀圖、密度圖,以橫縱坐標兩個維度為主
同時可延展出多種其他圖表樣式

plt.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None, legend=False,
style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None,
rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, label=None, secondary_y=False, **kwds)

 

ts.plot() 由Series直接生成圖表

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline

# Series直接生成圖表
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
ts.plot(kind='line',
        label = 'hello',
       style = '--g.',
       color = 'red',
       alpha = 0.4,
       use_index = True,
       rot = 45,
       grid = True,
       ylim = [-50,50],
       yticks = list(range(-50,50,10)),
       figsize = (8,4),
       title = 'test',
       legend = True)
# plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'x')  # 網格
plt.legend()
# Series.plot():series的index為橫坐標,value為縱坐標
# kind → line,bar,barh...(折線圖,柱狀圖,柱狀圖-橫...)
# label → 圖例標簽,Dataframe格式以列名為label
# style → 風格字符串,這里包括了linestyle(-),marker(.),color(g)
# color → 顏色,有color指定時候,以color顏色為准
# alpha → 透明度,0-1
# use_index → 將索引用為刻度標簽,默認為True
# rot → 旋轉刻度標簽,0-360
# grid → 顯示網格,一般直接用plt.grid
# xlim,ylim → x,y軸界限
# xticks,yticks → x,y軸刻度值
# figsize → 圖像大小
# title → 圖名
# legend → 是否顯示圖例,一般直接用plt.legend()
# 也可以 → plt.plot()

 Dataframe直接生成圖表 df.plot( )

df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))
df = df.cumsum()
df.plot(kind='line',
       style = '--.',
       alpha = 0.4,
       use_index = True,
       rot = 45,
       grid = True,
       figsize = (8,4),
       title = 'test',
       legend = True,
       subplots = False, #False是將這4條線繪制到一個圖里邊。
       colormap = 'Greens')
# subplots → 是否將各個列繪制到不同圖表,默認False
# 也可以 → plt.plot(df)

2.柱狀圖、堆疊圖、面積圖、填圖

plt.plot(kind='bar/barh') , plt.bar()

柱狀圖、堆疊圖

s.plot(kind='bar',color = 'k',grid = True,alpha = 0.5,ax = axes[0])單系列柱狀圖、
df.plot(kind='bar',ax = axes[1],grid = True,colormap='Reds_r')# 多系列柱狀圖 、
df.plot(kind='bar',ax = axes[2],grid = True,colormap='Blues_r',stacked=True) # 多系列堆疊圖
df.plot.barh(ax = axes[3],grid = True,stacked=True,colormap = 'BuGn_r')
fig, axes = plt.subplots(4, 1, figsize = (10, 10)) #4個沒有數據的圖表
s = pd.Series(np.random.randint(0,10,16),index = list('abcdefghijklmnop'))  
df = pd.DataFrame(np.random.rand(10,3), columns=['a','b','c'])
s.plot(kind='bar',color = 'k',grid = True,alpha = 0.5,ax = axes[0])  # ax參數 → 選擇第幾個子圖  # 單系列柱狀圖方法一:plt.plot(kind='bar/barh')

df = pd.DataFrame(np.random.rand(10,3), columns=['a','b','c'])
df.plot(kind='bar',ax = axes[1],grid = True,colormap='Reds_r')# 多系列柱狀圖

df.plot(kind='bar',ax = axes[2],grid = True,colormap='Blues_r',stacked=True) # 多系列堆疊圖 # stacked → 堆疊


df.plot.barh(ax = axes[3],grid = True,stacked=True,colormap = 'BuGn_r')  # 新版本plt.plot.<kind>

柱狀圖 plt.bar() --第二種繪制方法

plt.bar(x, y1, width=1, facecolor='yellowgreen', edgecolor='white', yerr=y1*0.1)
for i,j in zip(x, y1):
    plt.text(i+0.3, j-0.15, '%.2f' % j, color = 'white')
plt.figure(figsize=(10,4))
x = np.arange(10)
y1 = np.random.rand(10)
y2 = -np.random.rand(10)
plt.bar(x, y1, width=1, facecolor='yellowgreen', edgecolor='white', yerr=y1*0.1)
plt.bar(x,y2,width = 1,facecolor = 'lightskyblue',edgecolor = 'white',yerr = y2*0.1)
# x,y參數:x,y值
# width:寬度比例
# facecolor柱狀圖里填充的顏色、edgecolor是邊框的顏色
# left-每個柱x軸左邊界,bottom-每個柱y軸下邊界 → bottom擴展即可化為甘特圖 Gantt Chart
# align:決定整個bar圖分布,默認left表示默認從左邊界開始繪制,center會將圖繪制在中間位置
# xerr/yerr :x/y方向error bar;誤差線

for i,j in zip(x, y1):
    plt.text(i+0.3, j-0.15, '%.2f' % j, color = 'white')
for i, j in zip(x, y2):
    plt.text(i+0.3,j+0.05,'%.2f' % -j, color = 'white')
# 給圖添加text
# zip() 函數用於將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,將i,j打包成元組,然后返回由這些元組組成的列表。
print(list(zip(x,y1)))

---->>>>
[(0, 0.47736539792043764), (1, 0.82954841542507074), (2, 0.20566514192862784), (3, 0.27679883800197358), (4, 0.45433494683444564), 
(5, 0.89112910457025774), (6, 0.66065810313224915), (7, 0.91252133491535792), (8, 0.50006974665511594), (9, 0.13332483000972351)]

外嵌圖表plt.table( ) 在圖下面嵌入它的表格數據

plt.table(cellText = data,
          cellLoc='center', #圖表里邊的數據居中對齊
          cellColours = None, #數據的顏色
          rowLabels = rows, #行標簽
          rowColours = plt.cm.BuPu(np.linspace(0, 0.5,5))[::-1],  # BuPu可替換成其他colormap 行標簽的顏色
      rowLoc = ‘right’,#行標簽對齊位置
      colLabels = columns, #列標簽 colColours = plt.cm.Reds(np.linspace(0, 0.5,5))[::-1], #列標簽的顏色,[::-1]是做一個反向 loc='bottom') #表格位置
# table(cellText=None, cellColours=None,cellLoc='right', colWidths=None,rowLabels=None, rowColours=None, rowLoc='left',
# colLabels=None, colColours=None, colLoc='center',loc='bottom', bbox=None)
data = [[ 66386, 174296,  75131, 577908,  32015],
        [ 58230, 381139,  78045,  99308, 160454],
        [ 89135,  80552, 152558, 497981, 603535],
        [ 78415,  81858, 150656, 193263,  69638],
        [139361, 331509, 343164, 781380,  52269]]
columns = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
rows = ['%d year' % x for x in (100, 50, 20, 10, 5)]
df = pd.DataFrame(data,columns = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail'),
                 index = ['%d year' % x for x in (100, 50, 20, 10, 5)])
print(df)
df.plot(kind='bar',grid = True,colormap='Blues_r',stacked=True,figsize=(8,3))# 創建堆疊圖
plt.table(cellText = data, cellLoc='center', cellColours = None, rowLabels = rows, rowColours = plt.cm.BuPu(np.linspace(0, 0.5,5))[::-1], # BuPu可替換成其他colormap colLabels = columns, colColours = plt.cm.Reds(np.linspace(0, 0.5,5))[::-1], rowLoc='right', loc='bottom') # cellText:表格文本 # cellLoc:cell內文本對齊位置 # rowLabels:行標簽 # colLabels:列標簽 # rowLoc:行標簽對齊位置 # loc:表格位置 → left,right,top,bottom plt.xticks([]) #加上的話會顯得混亂,去掉就看的清了。 # 不顯示x軸標注

--------->>

          Freeze    Wind   Flood   Quake    Hail
100 year   66386  174296   75131  577908   32015
50 year    58230  381139   78045   99308  160454
20 year    89135   80552  152558  497981  603535
10 year    78415   81858  150656  193263   69638
5 year    139361  331509  343164  781380   52269

3.面積圖、填圖、餅圖

plt.plot.area()
plt.fill(), plt.fill_between()
plt.pie()

  面積圖

上邊的多系列的折線圖只能表示4個線的變化情況,只能是並行的;而面積圖可以堆疊,可以把4個堆疊到一起看整體的一個變化趨勢。

df1.plot.area(colormap = 'Greens_r',alpha = 0.5,ax = axes[0])
df2.plot.area(stacked=False,colormap = 'Set2',alpha = 0.5,ax = axes[1])
fig,axes = plt.subplots(2,1,figsize = (8,6))
df1 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])

df1.plot.area(colormap = 'Greens_r',alpha = 0.5,ax = axes[0])
df2.plot.area(stacked=False,colormap = 'Set2',alpha = 0.5,ax = axes[1])

# 使用Series.plot.area()和DataFrame.plot.area()創建面積圖
# stacked:是否堆疊,默認情況下,區域圖被堆疊
# 為了產生堆積面積圖,每列必須是正值或全部負值!
# 當數據有NaN時候,自動填充0,所以圖標簽需要清洗掉缺失值

填圖

axes[0].fill(x, y1, 'r',alpha=0.5,label='y1')
axes[1].fill_between(x, y1, y2, color ='b',alpha=0.5,label='area')
# 填圖 

fig,axes = plt.subplots(2,1,figsize = (8,6))

x = np.linspace(0, 1, 500)
y1 = np.sin(4 * np.pi * x) * np.exp(-5 * x)
y2 = -np.sin(4 * np.pi * x) * np.exp(-5 * x)
axes[0].fill(x, y1, 'r',alpha=0.5,label='y1')
axes[0].fill(x, y2, 'g',alpha=0.5,label='y2')
# 對函數與坐標軸之間的區域進行填充,使用fill函數
# 也可寫成:plt.fill(x, y1, 'r',x, y2, 'g',alpha=0.5)

x = np.linspace(0, 5 * np.pi, 1000) 
y1 = np.sin(x)  
y2 = np.sin(2 * x)  
axes[1].fill_between(x, y1, y2, color ='b',alpha=0.5,label='area')   #label是填充里邊顏色的label
# 填充兩個函數之間的區域,使用fill_between函數

for i in range(2):
    axes[i].legend()
    axes[i].grid()
# 添加圖例、格網

 

餅圖

plt.pie(s,
       explode = [0.1,0,0,0],
       labels = s.index,
       colors=['r', 'g', 'b', 'c'],
       autopct='%.2f%%', 
       pctdistance=0.6, 
       labeldistance = 1.2,
       shadow = True,
       startangle=0,
       radius=1.5,
       frame=False)
# 餅圖 plt.pie()
# plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, 
# radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=None, data=None)

s = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
plt.axis('equal')  # 保證長寬相等

plt.pie(s,
       explode = [0.1,0,0,0],
       labels = s.index,
       colors=['r', 'g', 'b', 'c'],
       autopct='%.2f%%',
       pctdistance=0.6,
       labeldistance = 1.2,
       shadow = True,
       startangle=0,
       radius=1.5,
       frame=False)
print(s)
# 第一個參數:數據
# explode:指定每部分的偏移量
# labels:標簽
# colors:顏色
# autopct:餅圖上的數據標簽顯示方式
# pctdistance:每個餅切片的中心和通過autopct生成的文本開始之間的比例
# labeldistance:被畫餅標記的直徑,默認值:1.1
# shadow:陰影
# startangle:開始角度
# radius:半徑
# frame:圖框
# counterclock:指定指針方向,順時針或者逆時針

4.直方圖

plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None,
histtype='bar', align='mid', orientation='vertical',rwidth=None, log=False, color=None, label=None,
stacked=False, hold=None, data=None, **kwargs)

 直方圖+密度圖

s.hist(bins = 20,
       histtype = 'bar',
       align = 'mid',
       orientation = 'vertical',
       alpha=0.5,
       normed =True)
s.plot(kind='kde',style='k--')
# 直方圖+密度圖

s = pd.Series(np.random.randn(1000))
s.hist(bins = 20,
       histtype = 'bar',
       align = 'mid',
       orientation = 'vertical',
       alpha=0.5,
       normed =True)
# bin:箱子的寬度
# normed 標准化
# histtype 風格,bar,barstacked,step,stepfilled
# orientation 水平還是垂直{‘horizontal’, ‘vertical’}
# align : {‘left’, ‘mid’, ‘right’}, optional(對齊方式)

s.plot(kind='kde',style='k--')
# 密度圖

直方圖的堆疊

df.plot.hist(stacked=True,
             bins=20,
             colormap='Greens_r',
             alpha=0.5,
             grid=True) 
df.hist(bins=50) 生成多個直方圖
 
# 堆疊直方圖

plt.figure(num=1)
df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
                    'c': np.random.randn(1000) - 1, 'd': np.random.randn(1000)-2},
                   columns=['a', 'b', 'c','d'])
df.plot.hist(stacked=True,
             bins=20,
             colormap='Greens_r',
             alpha=0.5,
             grid=True)
# 使用DataFrame.plot.hist()和Series.plot.hist()方法繪制
# stacked:是否堆疊

df.hist(bins=50)
# 生成多個直方圖 a b c d 

 

 

5.散點圖、矩陣散點圖

plt.scatter(), pd.scatter_matrix()

plt.scatter(x,y,marker='.',
           s = np.random.randn(1000)*100,#可以設置標量值如10,也可以設置隨機值。
           cmap = 'Reds',
           c = y,
           alpha = 0.8,)

 X Y軸坐標是兩個維度,點如大小是個維度,點的顏色也是個維度

# plt.scatter()散點圖
# plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, 
# alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)

plt.figure(figsize=(8,6))
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.scatter(x,y,marker='.',
           s = np.random.randn(1000)*100,#可以設置標量值如10,也可以設置隨機值。
           cmap = 'Reds',
           c = y,
           alpha = 0.8,)
plt.grid() #顯示網格
# s:散點的大小
# c:散點的顏色
# vmin,vmax:亮度設置,標量
# cmap:colormap

pd.scatter_matrix(df,figsize=(10,6),
                 marker = 'o',
                 diagonal='kde',
                 alpha = 0.5,
                 range_padding=0.1)
# pd.scatter_matrix()散點矩陣
# pd.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, 
# grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **kwds)

df = pd.DataFrame(np.random.randn(100,4),columns = ['a','b','c','d'])
pd.scatter_matrix(df,figsize=(10,6),
                 marker = 'o',
                 diagonal='kde',
                 alpha = 0.5,
                 range_padding=0.1)
# diagonal:({‘hist’, ‘kde’}),必須且只能在{‘hist’, ‘kde’}中選擇1個 → 每個指標的頻率圖
# range_padding:(float, 可選),圖像在x軸、y軸原點附近的留白(padding),該值越大,留白距離越大,圖像遠離坐標原點

---->> 散點矩陣,a b c d之間互相比較

array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000000002039B5C0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x000000002054FDD8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000000206FF278>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000000207349E8>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x000000002077CCF8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000000207B9B70>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000000020801B38>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000000020811D68>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000000020891710>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000000208DC748>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x000000002091C630>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x000000002096C128>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000000209A3978>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000000209F4208>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000000020A2C978>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000000020A73C88>]], dtype=object)

6.極坐標圖

在平面內取一個定點O, 叫極點,引一條射線Ox,叫做極軸,再選定一個長度單位和角度的正方向(通常取逆時針方向)。對於平面內任何一點M,用ρ表示線段OM的長度,θ表示從Ox到OM的角度,ρ叫做點M的極徑,θ叫做點M的極角,有序數對 (ρ,θ)就叫點M的極坐標,這樣建立的坐標系叫做極坐標系。

在極坐標中,x被ρcosθ代替,y被ρsinθ代替。ρ^2=(x^2+y^2)

直角坐標系坐標與極坐標的轉化:

例如:(2,π/3)為極坐標,它所對應的直角坐標為(2×cos  π/3,2×sin   π/3)。

坐標是用該點到定點(稱作極點)的距離及該點和極點的連線與過極點的射線(稱為極軸)所成的角度來確定坐標的。

調用subplot()創建子圖時通過設置projection='polar',便可創建一個極坐標子圖,然后調用plot()在極坐標子圖中繪圖。

fig = plt.figure(figsize=(8,4))
ax1 = plt.subplot(121, projection = 'polar')     ax2 = plt.subplot(122)
ax1.plot(theta,theta*3,linestyle = '--',lw=1) ax2.plot(theta,theta*3,linestyle = '--',lw=1)

# 創建極坐標軸


s = pd.Series(np.arange(20))
theta=np.arange(0,2*np.pi,0.02)
print(s.head())
print(theta[:10])
# 創建數據

fig = plt.figure(figsize=(8,4))
ax1 = plt.subplot(121, projection = 'polar')
ax2 = plt.subplot(122)
# 創建極坐標子圖
# 還可以寫:ax = fig.add_subplot(111,polar=True)

ax1.plot(theta,theta*3,linestyle = '--',lw=1)  
ax1.plot(s, linestyle = '--', marker = '.',lw=2)
ax2.plot(theta,theta*3,linestyle = '--',lw=1)
ax2.plot(s)
plt.grid()
# 創建極坐標圖,參數1為角度(弧度制),參數2為value
# lw → 線寬

theta=np.arange(0,2*np.pi,0.02)  plt.figure(figsize=(8,4))  ax1= plt.subplot(121, projection='polar')  ax1.plot(theta,theta/6,'--',lw=2)
ax2.set_theta_direction(-1)設置坐標軸正方形即順時針,默認是逆時針;
ax2.set_thetagrids(np.arange(0.0, 360.0, 90),['a','b','c','d'])設置極坐標角度--網格線與角度標簽數量要一致;
ax2.set_rgrids(np.arange(0.2,2,0.4))設置極徑網格線顯示,0.2--2之間,相隔0.4;
ax2.set_theta_offset(np.pi/2) 設置角度偏移,逆時針、弧度制;   

ax2.set_rlim(0.2,1.2) 設置極徑0.2--1.2的范圍; ax2.set_rmax(2)設置顯示的極徑最大值;
ax2.set_rticks(np.arange(0.1, 1.5, 0.2))設置極徑網格線的顯示范圍0.1--1.5,每隔0.2個;
# 極坐標參數設置
theta=np.arange(0,2*np.pi,0.02)
plt.figure(figsize=(8,4))
ax1= plt.subplot(121, projection='polar')
ax2= plt.subplot(122, projection='polar')
ax1.plot(theta,theta/6,'--',lw=2)
ax2.plot(theta,theta/6,'--',lw=2)
# 創建極坐標子圖ax

ax2.set_theta_direction(-1)
# set_theta_direction():坐標軸正方向,默認逆時針

ax2.set_thetagrids(np.arange(0.0, 360.0, 90),['a','b','c','d'])
ax2.set_rgrids(np.arange(0.2,2,0.4))
# set_thetagrids():設置極坐標角度網格線顯示及標簽 → 網格和標簽數量一致
# set_rgrids():設置極徑網格線顯示,其中參數必須是正數

ax2.set_theta_offset(np.pi/2)
# set_theta_offset():設置角度偏移,逆時針,弧度制

ax2.set_rlim(0.2,1.2)
ax2.set_rmax(2)
ax2.set_rticks(np.arange(0.1, 1.5, 0.2))
# set_rlim():設置顯示的極徑范圍
# set_rmax():設置顯示的極徑最大值
# set_rticks():設置極徑網格線的顯示范圍

--> 

[<matplotlib.axis.YTick at 0x20ee45c0>,
 <matplotlib.axis.YTick at 0x20eeacc0>,
 <matplotlib.axis.YTick at 0x20f0d5c0>,
 <matplotlib.axis.YTick at 0x20f0dcf8>,
 <matplotlib.axis.YTick at 0x20f0f470>,
 <matplotlib.axis.YTick at 0x20eefbe0>,
 <matplotlib.axis.YTick at 0x20f14400>]

 雷達圖

先創建極坐標--->>創建數據 
ax1.plot(theta,data1,'.--',label='data1') 繪制軌跡 --------->>> ax1.fill(theta,data1,alpha=0.2) 圈起來;
# 雷達圖1 - 極坐標的折線圖,直接在極坐標上繪制了個折線圖 - plt.plot() 它並沒有首尾相連。

plt.figure(figsize=(8,4))

ax1= plt.subplot(111, projection='polar')
ax1.set_title('radar map\n')  # 創建標題
ax1.set_rlim(0,12)

data1 = np.random.randint(1,10,10)
data2 = np.random.randint(1,10,10)
data3 = np.random.randint(1,10,10)
theta=np.arange(0,2*np.pi,2*np.pi/10)
# 創建數據

ax1.plot(theta,data1,'.--',label='data1')
ax1.fill(theta,data1,alpha=0.2)
ax1.plot(theta,data2,'.--',label='data2')
ax1.fill(theta,data2,alpha=0.2)
ax1.plot(theta,data3,'.--',label='data3')
ax1.fill(theta,data3,alpha=0.2)
# 繪制雷達線

 

data1 = np.concatenate((data1, [data1[0]])); angles = np.concatenate((angles, [angles[0]])) # 閉合
plt.polar(angles, data1, 'o-', linewidth=1)做極坐標;   plt.fill(angles, data1, alpha=0.25) 填充;
# 雷達圖2 - 極坐標的折線圖/填圖 - plt.polar() 首尾閉合,因為它最后需要交到一個點。

labels = np.array(['a','b','c','d','e','f']) # 標簽
dataLenth = 6 # 數據長度
data1 = np.random.randint(0,10,6) 
data2 = np.random.randint(0,10,6) # 數據

angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False) #分割圓周長
data1 = np.concatenate((data1, [data1[0]]))  #做一個首尾閉合,原來的6個值就變成了7個值。
data2 = np.concatenate((data2, [data2[0]]))  #閉合
angles = np.concatenate((angles, [angles[0]])) # 閉合

plt.polar(angles, data1, 'o-', linewidth=1) #做極坐標系
plt.fill(angles, data1, alpha=0.25)# 填充,即便不填充顏色它也是閉合的哦。
plt.polar(angles, data2, 'o-', linewidth=1) #做極坐標系
plt.fill(angles, data2, alpha=0.25)# 填充

plt.thetagrids(angles * 180/np.pi, labels) # 設置網格、標簽
plt.ylim(0,10)  # polar的極值設置為ylim

 

bar = ax1.bar(theta,data,alpha=0.5)
for r,bar in zip(data, bar):
    bar.set_facecolor(plt.cm.jet(r/10.))
# 極軸圖 - 極坐標的柱狀圖

plt.figure(figsize=(8,4))

ax1= plt.subplot(111, projection='polar')
ax1.set_title('radar map\n')  # 創建標題
ax1.set_rlim(0,12)

data = np.random.randint(1,10,10)
theta=np.arange(0,2*np.pi,2*np.pi/10)
# 創建數據

bar = ax1.bar(theta,data,alpha=0.5)
for r,bar in zip(data, bar):
    bar.set_facecolor(plt.cm.jet(r/10.))  # 設置顏色
plt.thetagrids(np.arange(0.0, 360.0, 90), []) # 設置網格、標簽(這里是空標簽,則不顯示內容)

7.箱型圖

  箱型圖:又稱為盒須圖、盒式圖、盒狀圖或箱線圖,是一種用作顯示一組數據分散情況資料的統計圖
包含一組數據的:最大值、最小值(這里的最大、小值並不是整個數據中的最大小值,而是拋開異常值之外的)、中位數、上四分位數(Q1)、下四分位數(Q3)、異常值
① 中位數 → 一組數據平均分成兩份,中間的數
② 下四分位數Q1 → 是將序列平均分成四份,計算(n+1)/4與(n-1)/4兩種,一般使用(n+1)/4 
③ 上四分位數Q3 → 是將序列平均分成四份,計算(1+n)/4*3=6.75
④ 內限 → T形的盒須就是內限,最大值區間Q3+1.5IQR,最小值區間Q1-1.5IQR (IQR=Q3-Q1)
⑤ 外限 → T形的盒須就是內限,最大值區間Q3+3IQR,最小值區間Q1-3IQR (IQR=Q3-Q1)
⑥ 異常值 → 內限之外 - 中度異常,外限之外 - 極度異常

plt.plot.box( ),plt.boxplot( )

df.plot.box(ylim=[0,1.2],
           grid = True,
           color = color,
           ax = axes[0])
# plt.plot.box()繪制

fig,axes = plt.subplots(2,1,figsize=(10,6))
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
# 箱型圖着色
# boxes → 箱線
# whiskers → 分位數與error bar(指的就是邊緣線)橫線之間豎線的顏色
# medians → 中位數(不是均值)線顏色
# caps → error bar橫線的顏色

df.plot.box(ylim=[0,1.2],
           grid = True,
           color = color,
           ax = axes[0])
# color:樣式填充

df.plot.box(vert=False,   #vert參數是否垂直;
            positions=[1, 4, 5, 6, 8], #分別對應columns參數 A B C D 所在的位置;
            ax = axes[1],
            grid = True,
           color = color)
# vert:是否垂直,默認True
# position:箱型圖占位

箱型圖的另外一種畫法 plt.boxplot( )

# plt.boxplot()繪制
# pltboxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, 
# usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, 
# labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_xticks=True, autorange=False, 
# zorder=None, hold=None, data=None)

df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
plt.figure(figsize=(10,4))
# 創建圖表、數據

f = df.boxplot(sym = 'o',  # 異常點形狀,參考marker
               vert = True,  # 是否垂直,默認True是垂直
               whis = 1.5,  # IQR,默認1.5 內限 ,也可以設置區間比如[5,95],代表強制上下邊緣為數據95%和5%位置如果IQR改為3就是外限;
               patch_artist = True,  # 上下四分位框內是否填充,True為填充
               meanline = False,showmeans=True,  # 是否有均值線及其形狀;meanline是否用線的形式顯示均值,默認用點;showmeans是否顯示均值,默認不顯示。
               showbox = True,  # 是否顯示箱線
               showcaps = True,  # 是否顯示邊緣線
               showfliers = True,  # 是否顯示異常值
               notch = False,  # 中間箱體是否缺口
               return_type='dict'  # 返回類型為字典;
              ) 
plt.title('boxplot')
print(f)

-->

{'caps': [<matplotlib.lines.Line2D object at 0x0000000023BD49B0>, <matplotlib.lines.Line2D object at 0x0000000023BD4B38>, 
<matplotlib.lines.Line2D object at 0x0000000023BEB940>, <matplotlib.lines.Line2D object at 0x0000000023BEBAC8>,
<matplotlib.lines.Line2D object at 0x0000000023C028D0>, <matplotlib.lines.Line2D object at 0x0000000023C02A58>,
<matplotlib.lines.Line2D object at 0x0000000023C19860>, <matplotlib.lines.Line2D object at 0x0000000023C19F98>,
<matplotlib.lines.Line2D object at 0x0000000023C2E7F0>, <matplotlib.lines.Line2D object at 0x0000000023B94A20>],

'means': [<matplotlib.lines.Line2D object at 0x0000000023BD8BA8>, <matplotlib.lines.Line2D object at 0x0000000023BF2B38>,
<matplotlib.lines.Line2D object at 0x0000000023C07AC8>, <matplotlib.lines.Line2D object at 0x0000000023C1FA58>,
<matplotlib.lines.Line2D object at 0x0000000023B97A58>], 'fliers': [<matplotlib.lines.Line2D object at 0x0000000023BE0A58>,
<matplotlib.lines.Line2D object at 0x0000000023BF69E8>, <matplotlib.lines.Line2D object at 0x0000000023C0D978>,
<matplotlib.lines.Line2D object at 0x0000000023C23908>, <matplotlib.lines.Line2D object at 0x0000000023B90BA8>],

'whiskers': [<matplotlib.lines.Line2D object at 0x0000000023BCE780>, <matplotlib.lines.Line2D object at 0x0000000023BCE9E8>,
<matplotlib.lines.Line2D object at 0x0000000023BE47F0>, <matplotlib.lines.Line2D object at 0x0000000023BE4A58>,
<matplotlib.lines.Line2D object at 0x0000000023BFB780>, <matplotlib.lines.Line2D object at 0x0000000023BFBF98>,
<matplotlib.lines.Line2D object at 0x0000000023C13710>, <matplotlib.lines.Line2D object at 0x0000000023C13EF0>,
<matplotlib.lines.Line2D object at 0x0000000023C2A6A0>, <matplotlib.lines.Line2D object at 0x0000000023C2AF98>],

'boxes': [<matplotlib.patches.PathPatch object at 0x0000000023BCE128>, <matplotlib.patches.PathPatch object at 0x0000000023BE4198>,
<matplotlib.patches.PathPatch object at 0x0000000023BFB128>, <matplotlib.patches.PathPatch object at 0x0000000023C130B8>,
<matplotlib.patches.PathPatch object at 0x0000000023C2A048>],

'medians': [<matplotlib.lines.Line2D object at 0x0000000023BD8390>, <matplotlib.lines.Line2D object at 0x0000000023BF2320>,
<matplotlib.lines.Line2D object at 0x0000000023C072B0>, <matplotlib.lines.Line2D object at 0x0000000023C1F240>,
<matplotlib.lines.Line2D object at 0x0000000023B94978>]}

 

#可以進行遍歷字典去改里邊的參數樣式
for
box in f['boxes']: box.set( color='b', linewidth=1) # 箱體邊框顏色 box.set( facecolor = 'b' ,alpha=0.5) # 箱體內部填充顏色 for whisker in f['whiskers']: whisker.set(color='k', linewidth=0.5,linestyle='-') for cap in f['caps']: cap.set(color='gray', linewidth=2) for median in f['medians']: median.set(color='DarkBlue', linewidth=2) for flier in f['fliers']: flier.set(marker='o', color='y', alpha=0.5) # boxes, 箱線 # medians, 中位值的橫線, # whiskers, 從box到error bar之間的豎線. # fliers, 異常值 # caps, error bar橫線 # means, 均值的橫線,

 

# plt.boxplot()繪制 分組匯總
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'])
df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
print(df)
df.boxplot(by = 'X')
df.boxplot(column=['Col1','Col2'], by=['X','Y'])
# columns:按照數據的列分子圖
# by:按照列分組做箱型圖

------> >>>

      Col1      Col2  X  Y
0  0.864057  0.773447  A  A
1  0.866570  0.620441  A  B
2  0.105994  0.944422  A  A
3  0.959510  0.007522  A  B
4  0.341135  0.421671  A  A
5  0.357656  0.999898  B  B
6  0.889062  0.440674  B  A
7  0.656127  0.548576  B  B
8  0.306237  0.841735  B  A
9  0.961797  0.611649  B  B

array([<matplotlib.axes._subplots.AxesSubplot object at 0x000000002E578208>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x000000002E698F98>], dtype=object)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM