一文學會matplotlib

matplotlib基礎

「「「
假設一天中每隔兩個小時(range(2,26,2))的氣溫(℃)分別是[15,13,14.5,17,20,25,26,26,27,22,18,15]
用matplotlib用圖形畫出變化的折線圖
"""
from matplotlib import pyplot as plt

"""設置中文"""
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤

"""設置圖片大小"""
plt.figure(figsize=(16, 6), dpi=80)

"""準備數據"""
x = range(2, 26, 2)  # x軸,數據是一個可迭代對象
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]  # y軸數據也是一個可迭代對象

"""繪圖"""
plt.plot(x, y, linestyle='--', linewidth=5, color='red')

"""設置x軸的刻度"""
_xtick_labels = [i / 2 for i in range(4, 49)]
plt.xticks(_xtick_labels[::2])  # 當列表太密集能夠設置列表步長調整間距
plt.yticks(range(min(y), max(y) + 1))

"""圖形保存"""
# plt.savefig('t1.png')

"""圖形標題"""
plt.title('matplotlib基礎')

"""圖形顯示"""
plt.show()

1、figure對象

我這裏單拿出一個一個的對象,而後後面在進行總結。在matplotlib中,整個圖表爲一個figure對象。其實對於每個彈出的小窗口就是一個Figure對象,那麼如何在一個代碼中建立多個Figure對象,也就是多個小窗口呢?html

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1, 1, 50)
y1 = x ** 2
y2 = x * 2
# 這個是第一個figure對象,下面的內容都會在第一個figure中顯示
plt.figure()
plt.plot(x, y1)
# 這裏第二個figure對象
plt.figure(num=3, figsize=(10, 5))
plt.plot(x, y2)
plt.show()

  

 

 

這裏須要注意的是:python

  1. 咱們看上面的每一個圖像的窗口,能夠看出figure並無從1開始而後到2,這是由於咱們在建立第二個figure對象的時候,指定了一個num = 3的參數,因此第二個窗口標題上顯示的figure3。
  2. 對於每個窗口,咱們也能夠對他們分別去指定窗口的大小。也就是figsize參數。
  3. 若咱們想讓他們的線有所區別,咱們能夠用下面語句進行修改
plt.plot(x,y2,color = 'red',linewidth = 3.0,linestyle = '--')

2、figure子圖

# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import pandas as pd

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤

data = pd.read_csv("data/four platform.csv")

fig, axes = plt.subplots(nrows=2, ncols=2)
ax0, ax1, ax2, ax3 = axes.flatten()

ax0.plot(data["day"], data["Med-counter"], label="生物醫學", color='gray', linestyle=':')
ax0.plot(data["day"], data["Nonmed-counter"], label="非生物醫學", color='gray', linestyle='-')
ax0.legend(prop={'size': 7}, loc="upper left")
# ax0.set_xlabel('day')
ax0.set_ylabel('平均Counter值')

ax1.plot(data["day"], data["Med-mendeley"], label="生物醫學", color='gray', linestyle=':')
ax1.plot(data["day"], data["Nonmed-mendeley"], label="非生物醫學", color='gray', linestyle='-')
ax1.legend(prop={'size': 7}, loc="upper left")
# ax1.set_xlabel('day',fontsize=6)
ax1.set_ylabel('平均Mendeley值')

ax2.plot(data["day"], data["Med-pmc"], label="生物醫學", color='gray', linestyle=':')
ax2.plot(data["day"], data["Nonmed-pmc"], label="非生物醫學", color='gray', linestyle='-')
ax2.legend(prop={'size': 7}, loc="upper left")
ax2.set_xlabel('論文發表天數')
ax2.set_ylabel('平均PMC值')

ax3.plot(data["day"], data["Med-twitter"], label="生物醫學", color='gray', linestyle=':')
ax3.plot(data["day"], data["Nonmed-twitter"], label="非生物醫學", color='gray', linestyle='-')
ax3.legend(prop={'size': 7}, loc="upper left")
ax3.set_xlabel('論文發表天數')
ax3.set_ylabel('平均Twitter值')
ax3.set_ylim(0, 8)

plt.show()

  

 

3、legend圖例

咱們不少時候會再一個figures中去添加多條線,那咱們如何去區分多條線呢?這裏就用到了legend。linux

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1, 1, 50)
y1 = x ** 2
y2 = x * 2

plt.figure()
# 添加圖例
l1, = plt.plot(x, y1, label='linear line')
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')


plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='best')
plt.show()

 

 

這裏須要注意的是:windows

  1. 若是咱們沒有在legend方法的參數中設置labels,那麼就會使用畫線的時候,也就是plot方法中的指定的label參數所指定的名稱,固然若是都沒有的話就會拋出異常;
  2. 其實咱們plt.plot的時候返回的是一個線的對象,若是咱們想在handle中使用這個對象,就必須在返回的名字的後面加一個","號;
legend = plt.legend(handles=[l1, l2], labels=['hu', 'tang'], loc='upper center', shadow=True)
frame = legend.get_frame()
frame.set_facecolor('r')  # 或者0.9...

4、在圖片上加一些標註annotation

在圖片上加註解有兩種方式:dom

# -*- coding: utf-8 -*-

"""
@Datetime: 2019/4/10
@Author: Zhang Yafei
"""
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y = 2 * x + 1

plt.figure(num=1, figsize=(8, 5))
plt.plot(x, y)

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 將底下的做爲x軸
ax.xaxis.set_ticks_position('bottom')
# 而且data,以y軸的數據爲基本
ax.spines['bottom'].set_position(('data', 0))

# 將左邊的做爲y軸
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

print("-----方式一-----")
x0 = 1
y0 = 2 * x0 + 1
plt.plot([x0, x0], [0, y0], 'k--', linewidth=2.5)
plt.scatter([x0], [y0], s=50, color='b')
plt.annotate(r'$2x+1 = %s$' % y0, xy=(x0, y0), xycoords='data',
             xytext=(+30, -30), textcoords='offset points', fontsize=16
             , arrowprops=dict(arrowstyle='->',
                               connectionstyle="arc3,rad=.2"))
plt.show()

 

第一種標註方式ide

plt.annotate(r'$2x+1 = %s$' % y0, xy=(x0, y0), xycoords='data',
             xytext=(+30, -30), textcoords='offset points', fontsize=16
             , arrowprops=dict(arrowstyle='->',
                               connectionstyle="arc3,rad=.2"))

注意:函數

  1. xy就是須要進行註釋的點的橫縱座標;
  2. xycoords = 'data'說明的是要註釋點的xy的座標是以橫縱座標軸爲基準的;
  3. xytext=(+30,-30)和textcoords='data'說明了這裏的文字是基於標註的點的x座標的偏移+30以及標註點y座標-30位置,就是咱們要進行註釋文字的位置;
  4. fontsize = 16就說明字體的大小;
  5. arrowprops = dict()這個是對於這個箭頭的描述,arrowstyle='->'這個是箭頭的類型,connectionstyle="arc3,rad=.2"這兩個是描述咱們的箭頭的弧度以及角度的。

第二種標註方式字體

print("-----方式二-----")
plt.text(-3.7, 3, r'$this\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
             fontdict={'size': 16, 'color': 'r'})

 

看一下這個圖this

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3,3,50)
y1 = 0.1*x
y2 = x**2

plt.figure()
#zorder控制繪圖順序
plt.plot(x,y1,linewidth = 10,zorder = 1,label = r'$y_1\ =\ 0.1*x$')
plt.plot(x,y2,linewidth = 10,zorder = 2,label = r'$y_2\ =\ x^{2}$')

plt.ylim(-2,2)

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

plt.show()

  

執行效果spa

從上面看,咱們能夠看見咱們軸上的座標被掩蓋住了,那麼咱們怎麼去修改他呢?

print(ax.get_xticklabels())
print(ax.get_yticklabels())

for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor = 'white',edgecolor='none',alpha = 0.8,zorder = 2))

<a list of 9 Text xticklabel objects>
<a list of 9 Text yticklabel objects>

 

  

讓座標軸顯示出來

這裏須要注意:

  1. ax.get_xticklabels()獲取獲得就是座標軸上的數字;
  2. set_bbox()這個bbox就是那座標軸上的數字的那一小塊區域,從結果咱們能夠很明顯的看出來;
  3. facecolor = 'white',edgecolor='none,第一個參數表示的這個box的前面的背景,邊上的顏色。

圖形種類

1、折線圖基礎

import random

"""
若是列表a表示10點到12點的每一分鐘的氣溫,如何繪製折線圖觀察每分鐘氣溫的變化狀況?
a= [random.randint(20,35) for i in range(120)]
用matplotlib用圖形畫出變化的折線圖
"""

from matplotlib import pyplot as plt
import matplotlib
from matplotlib import font_manager

#方式一
#windows和linux設置字體
# font = {'family' : 'SimHei'}
# matplotlib.rc('font', **font)

#方式二
my_font = font_manager.FontProperties(fname='font/simsun.ttc')

x = range(120)
y = [random.randint(20,35) for i in range(120)]

plt.figure(figsize=(13,8),dpi=80)

plt.plot(x,y)

#設置x的軸的刻度
_x = list(x)   #只有列表才能夠取步長,range不能夠取步長
_xtick_labels = ['10點{}分'.format(i) for i in range(60)]
_xtick_labels += ['11點{}分'.format(i) for i in range(60)]
#取步長,數字和字符串一一對應,數據的長度同樣
plt.xticks(_x[::3],_xtick_labels[::3], rotation=45,fontproperties=my_font)  #rotation旋轉的度數

#添加描述信息
plt.xlabel('時間',fontproperties=my_font)
plt.ylabel('溫度 單位(℃)',fontproperties=my_font)
plt.title('10點到12點每分鐘的氣溫變化狀況',fontproperties=my_font)

plt.show()

  

2、交女友數量走勢圖

# -*- coding: utf-8 -*-

"""
@Datetime: 2018/11/17
@Author: Zhang Yafei
"""
"""
假設你們在30歲的時候,根據本身的實際狀況,統計出來了從11歲到30歲每一年交的女(男)朋友的數量如列表a,請繪製出該數據的折線圖,以便分析本身每一年交女(男)朋友的數量走勢
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
要求:
    y軸表示個數
    x軸表示歲數,好比11歲,12歲等
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

#解決中文字體正常顯示
my_font = font_manager.FontProperties(fname='font/simsun.ttc')
#準備數據
x = range(11,31)
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
#設置圖形大小
plt.figure(figsize=(11,6),dpi=80)

#設置x,y軸的刻度
_x = list(x)
_xtick_labels = ['{}歲'.format(i) for i in _x]
plt.xticks(_x,_xtick_labels,rotation=45,fontproperties=my_font)
plt.yticks(range(0,9))

#繪製網格
plt.grid(alpha=0.4)  #alpha透明度

#設置描述信息
plt.xlabel('年齡',fontproperties=my_font)
plt.ylabel('個數',fontproperties=my_font)
plt.title('11-30歲交女友數量走勢圖',fontproperties=my_font)

plt.plot(x,y)

plt.show()

  

3、交女友數量走勢圖2

# -*- coding: utf-8 -*-

"""
@Datetime: 2018/11/17
@Author: Zhang Yafei
"""
"""
假設你們在30歲的時候,根據本身的實際狀況,統計出來了你和你同桌各自從11歲到30歲每一年交的女(男)朋友的數量如列表a和b,請在一個圖中繪製出該數據的折線圖,以便比較本身和同桌20年間的差別,同時分析每一年交女(男)朋友的數量走勢
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
要求:
    y軸表示個數
    x軸表示歲數,好比11歲,12歲等
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

#解決中文字體正常顯示
my_font = font_manager.FontProperties(fname='font/simsun.ttc')
#準備數據
x = range(11,31)
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]

#設置圖形大小
plt.figure(figsize=(11,6),dpi=80)

#設置x,y軸的刻度
_x = list(x)
_xtick_labels = ['{}歲'.format(i) for i in _x]
plt.xticks(_x,_xtick_labels,rotation=45,fontproperties=my_font)
# plt.yticks(range(0,9))

#繪製網格
plt.grid(alpha=0.4)  #alpha透明度

#設置描述信息
plt.xlabel('年齡',fontproperties=my_font)
plt.ylabel('個數',fontproperties=my_font)
plt.title('11-30歲交女友數量走勢圖',fontproperties=my_font)

plt.plot(x,y_1,label='本身',color='orange',linestyle=':')
plt.plot(x,y_2,label='同桌',color='cyan',linestyle='--')

plt.legend(prop=my_font,loc='upper left')

plt.show()

 

  

例:dataframe繪製折線圖

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import randn
from pandas import DataFrame

df = DataFrame(randn(10, 5), columns=['A', 'B', 'C', 'D', 'E'], index=np.arange(0, 100, 10))

df.plot()

plt.show()

 

多條折線圖

import matplotlib.pyplot as plt
import pandas as pd

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤

f = open(r"期刊總體趨勢.csv")
data = pd.read_csv(f)

y = range(0, 11000, 1000)
x = range(0, 180)

plt.plot(data["day"], data["pcbi"], color='gray', linestyle=':')
plt.plot(data["day"], data["pgen"], color='gray', linestyle='-')
plt.plot(data["day"], data["pmed"], color='gray', linestyle='--')
plt.plot(data["day"], data["pntd"], color='gray', linestyle='-.')
plt.plot(data["day"], data["pone"], color='gray', linewidth=5, linestyle='--')
plt.plot(data["day"], data["ppat"], color='gray', linewidth=5, linestyle=':')
plt.plot(data["day"], data["pbio"], color='gray', linewidth=5, linestyle='-')
# plt.plot(data["day"], data["pone"], color='gray', linewidth=5, linestyle='--', marker='2')
# plt.plot(data["day"], data["ppat"], color='gray', linewidth=5, linestyle=':', marker='3')
# plt.plot(data["day"], data["pbio"], color='gray', linewidth=5, linestyle='-', marker='*')

plt.ylim(0, 11000)
plt.legend()
plt.yticks(y)
plt.xlabel("天", fontsize="10")
plt.ylabel("期刊平均訪問量", fontsize="11")

plt.show()

 

4、散點圖

# -*- coding: utf-8 -*-

"""
@Datetime: 2018/11/17
@Author: Zhang Yafei
"""
"""
假設經過爬蟲你獲取到了北京2016年3,10月份天天白天的最高氣溫(分別位於列表a,b),那麼此時如何尋找出氣溫和隨時間(天)變化的某種規律?
a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

#設置中文字體
my_font = font_manager.FontProperties(fname='font/simsun.ttc')

#設置圖形大小
plt.figure(figsize=(13,6),dpi=80)

#數據準備
x_3 = range(1,32)
x_10 = range(51,82)
y_3 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
#使用scatter繪製散點圖和折線圖的惟一區別
plt.scatter(x_3,y_3,label='3月份')
plt.scatter(x_10,y_10,label='10月份')
plt.legend(loc='upper left',prop=my_font)
#調整x的刻度
_x = list(x_3) + list(x_10)
_xtick_labels = ['3月{}日'.format(i) for i in x_3]
_xtick_labels += ['10月{}日'.format(i-50) for i in x_10]
plt.xticks(_x[::3],_xtick_labels[::3],fontproperties=my_font,rotation=45)

#添加描述信息
plt.xlabel('時間',fontproperties=my_font)
plt.ylabel('溫度',fontproperties=my_font)
plt.title('3月份和10月份溫度對比圖',fontproperties=my_font)
#顯示
plt.show()

  

5、條形圖

# -*- coding: utf-8 -*-

"""
@Datetime: 2018/11/17
@Author: Zhang Yafei
"""
"""
假設你獲取到了2017年內地電影票房前20的電影(列表a)和電影票房數據(列表b),那麼如何更加直觀的展現該數據?
a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸","加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3","智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] 單位:億
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname='font/simsun.ttc')
plt.figure(figsize=(15,8),dpi=80)

a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸","加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3","智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

plt.bar(range(len(a)),b,width=0.3)

plt.xticks(range(len(a)),a,fontproperties=my_font,rotation=90)
plt.savefig('movie.png')
plt.show()

  

 

6、橫條形圖

"""
假設你獲取到了2017年內地電影票房前20的電影(列表a)和電影票房數據(列表b),那麼如何更加直觀的展現該數據?
a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸","加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3","智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] 單位:億
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname='font/simsun.ttc')
plt.figure(figsize=(15,8),dpi=80)

a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸","加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3","智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

plt.barh(range(len(a)),b,height=0.3,color='orange')

plt.yticks(range(len(a)),a,fontproperties=my_font)
plt.grid(alpha=0.4)
# plt.savefig('movie.png')
plt.show()

  

7、繪製屢次條形圖

# -*- coding: utf-8 -*-

"""
@Datetime: 2018/11/17
@Author: Zhang Yafei
"""
"""
假設你知道了列表a中電影分別在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,爲了展現列表中電影自己的票房以及同其餘電影的數據對比狀況,應該如何更加直觀的呈現該數據?
a = ["猩球崛起3:終極之戰","敦刻爾克","蜘蛛俠:英雄歸來","戰狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname='font/simsun.ttc')
plt.figure(figsize=(15,8),dpi=80)

a = ["猩球崛起3:終極之戰","敦刻爾克","蜘蛛俠:英雄歸來","戰狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]

bar_width = 0.2

x_14 = list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width*2 for i in x_14]

plt.bar(range(len(a)),b_14,width=bar_width,label='14日')
plt.bar(x_15,b_15,width=bar_width,label='15日')
plt.bar(x_16,b_16,width=bar_width,label='16日')

plt.legend(prop=my_font)

plt.xticks(x_14,a,fontproperties=my_font)

plt.grid(alpha=0.4)
# plt.savefig('movie.png')
plt.show()

  

例:dataframe繪製柱狀圖

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import randn
from pandas import DataFrame

df = DataFrame(abs(randn(10, 5)), columns=['A', 'B', 'C', 'D', 'E'], index=np.arange(0, 100, 10))

df.plot(kind='bar')

plt.show()

  

8、直方圖

# -*- coding: utf-8 -*-

"""
@Datetime: 2018/11/17
@Author: Zhang Yafei
"""
"""
直方圖:分佈狀態
假設你獲取了250部電影的時長(列表a中),但願統計出這些電影時長的分佈狀態(好比時長爲100分鐘到120分鐘電影的數量,出現的頻率)等信息,你應該如何呈現這些數據?
a=[131,  98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115,  99, 136, 126, 134,  95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123,  86, 101,  99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140,  83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144,  83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137,  92,121, 112, 146,  97, 137, 105,  98, 117, 112,  81,  97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112,  83,  94, 146, 133, 101,131, 116, 111,  84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

a=[131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115,  99, 136, 126, 134,  95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123,  86, 101,  99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140,  83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144,  83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137,  92,121, 112, 146,  97, 137, 105,  98, 117, 112,  81,  97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112,  83,  94, 146, 133, 101,131, 116, 111,  84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]

#計算組數
d = 3
num_bins = (max(a)-min(a))//d
#設置圖形大小
plt.figure(figsize=(15,8),dpi=80)
plt.hist(a,num_bins)   #頻數分佈直方圖
# plt.hist(a,num_bins,density=True)   #頻率分佈直方圖

#設置x軸的刻度
plt.xticks(range(min(a),max(a)+d,d))
plt.grid(alpha=0.3)
plt.show()

  

9、案例

# -*- coding: utf-8 -*-

"""
@Datetime: 2018/11/17
@Author: Zhang Yafei
"""
"""
在美國2004年人口普查發現有124 million的人在離家相對較遠的地方工做。根據他們從家到上班地點所須要的時間,經過抽樣統計(最後一列)出了下表的數據,這些數據可以繪製成直方圖麼?
interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager

interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]

plt.figure(figsize=(13,6),dpi=80)
plt.bar(range(len(quantity)),quantity,width=1)

#設置x軸的刻度
_x = [i-0.5 for i in range(13)]
_xtick_labels = interval + [150]
plt.xticks(_x,_xtick_labels)

plt.show()

  

 10、餅圖

餅圖(Pie Graph):又稱圓形圖,是一個劃分爲幾個扇形的扇形統計圖,它可以直觀的反映個體與整體的比例關係

例1:芝麻信用失信用戶教育水平分佈

import matplotlib.pyplot as plt

# font = {
#        'family':'SimHei'
#        }
# mpl.rc('font',**font)

# 設置繪圖的主題風格(不妨使用R中的ggplot分隔)
plt.style.use('ggplot')

# 構造數據
edu = [0.2515, 0.3724, 0.3336, 0.0368, 0.0057]
labels = ['中專', '大專', '本科', '碩士', '其餘']

explode = [0, 0.1, 0, 0, 0]  # 用於突出顯示大專學歷人羣
colors = ['#9999ff', '#ff9999', '#7777aa', '#2442aa', '#dd5555']  # 自定義顏色

# 中文亂碼和座標軸負號的處理
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 將橫、縱座標軸標準化處理,保證餅圖是一個正圓,不然爲橢圓
plt.axes(aspect='equal')

# 控制x軸和y軸的範圍
plt.xlim(0, 4)
plt.ylim(0, 4)

# 繪製餅圖
plt.pie(x=edu,  # 繪圖數據
        explode=explode,  # 突出顯示大專人羣
        labels=labels,  # 添加教育水平標籤
        colors=colors,  # 設置餅圖的自定義填充色
        autopct='%.1f%%',  # 設置百分比的格式,這裏保留一位小數
        pctdistance=0.8,  # 設置百分比標籤與圓心的距離
        labeldistance=1.15,  # 設置教育水平標籤與圓心的距離
        startangle=180,  # 設置餅圖的初始角度
        radius=1.5,  # 設置餅圖的半徑
        counterclock=False,  # 是否逆時針,這裏設置爲順時針方向
        wedgeprops={'linewidth': 1.5, 'edgecolor': 'green'},  # 設置餅圖內外邊界的屬性值
        textprops={'fontsize': 12, 'color': 'k'},  # 設置文本標籤的屬性值
        center=(1.8, 1.8),  # 設置餅圖的原點
        frame=1)  # 是否顯示餅圖的圖框,這裏設置顯示

# 刪除x軸和y軸的刻度
plt.xticks(())
plt.yticks(())
# 添加圖標題
plt.title('芝麻信用失信用戶教育水平分佈')
# 保存圖形
plt.savefig('芝麻信用失信用戶教育水平分佈.png')
# 顯示圖形
plt.show()

 

 

例2:手機品牌市場佔有率

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy
from pandas import read_csv

data = read_csv('E:/python/data_analysis/data/pie.csv')

gb = data.groupby(
    by=['通訊品牌'],
    as_index=False
)['號碼'].agg({
    '用戶數': numpy.size
})
font = {
    'family': 'SimHei'
}
mpl.rc('font', **font)
explode = [0.1, 0, 0]  # 0.1 凸出這部分,
plt.pie(gb['用戶數'], labels=gb['通訊品牌'], explode=explode, autopct='%.f%%',
        shadow=True, labeldistance=1.1, startangle=90, pctdistance=0.6)
plt.title('手機品牌市場佔有率')
plt.savefig('手機品牌市場佔有率.png')
plt.show()

# labeldistance,文本的位置離遠點有多遠,1.1指1.1倍半徑的位置
# autopct,圓裏面的文本格式,%3.1f%%表示小數有三位,整數有一位的浮點數
# shadow,餅是否有陰影
# startangle,起始角度,0,表示從0開始逆時針轉,爲第一塊。通常選擇從90度開始比較好看
# pctdistance,百分比的text離圓心的距離
# patches, l_texts, p_texts,爲了獲得餅圖的返回值,p_texts餅圖內部文本的,l_texts餅圖外label的文本

  

例3:各個國家之間的GDP佔比圖

import matplotlib.pyplot as plt


def draw_pie(labels, quants):
    # make a square figure
    plt.figure(1, figsize=(6, 6))
    # For China, make the piece explode a bit
    expl = [0, 0.1, 0, 0, 0, 0, 0, 0, 0, 0]  # 第二塊即China離開圓心0.1
    # Colors used. Recycle if not enough.
    colors = ["blue", "red", "coral", "green", "yellow", "orange"]  # 設置顏色(循環顯示)
    # Pie Plot
    # autopct: format of "percent" string;百分數格式
    plt.pie(quants, explode=expl, colors=colors, labels=labels, autopct='%1.1f%%', pctdistance=0.8, shadow=True)
    plt.title('Top 10 GDP Countries', bbox={'facecolor': '0.8', 'pad': 5})
    plt.savefig("pie.jpg")
    plt.show()
    plt.close()


# quants: GDP

# labels: country name

labels = ['USA', 'China', 'India', 'Japan', 'Germany', 'Russia', 'Brazil', 'UK', 'France', 'Italy']

quants = [15094025.0, 11299967.0, 4457784.0, 4440376.0, 3099080.0, 2383402.0, 2293954.0, 2260803.0, 2217900.0,
          1846950.0]

draw_pie(labels, quants)

  

 例4:series畫餅圖

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

# 簡單的餅圖
series = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
# series.plot.pie(figsize=(6, 6))
#
#
##多子圖餅圖
# df = pd.DataFrame(3 * np.random.rand(4, 2), index=['a', 'b', 'c', 'd'], columns=['x', 'y'])
# df.plot.pie(subplots=True, figsize=(8, 4))

# 有比例詳情的餅圖
series.plot.pie(labels=['AA', 'BB', 'CC', 'DD'], colors=['r', 'g', 'b', 'c'],
                autopct='%.2f', fontsize=10, figsize=(6, 6))
plt.show()

  

 11、等高線圖

import matplotlib.pyplot as plt
import numpy as np

# 創建等高線的函數
def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)


n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
# 等高線圖就是網格圖,生成網格
X, Y = np.meshgrid(x, y)

# 向等高線圖形上面的一些線條增長顏色
C = plt.contour(X, Y, f(X, Y), 5, color='black', linewidth=0.5)

# 向等高線圖形不一樣位置增長顏色
plt.contourf(X, Y, f(X, Y), 5, alpha=0.75, cmap=plt.cm.hot)

# 增長字體
plt.clabel(C, inline=True, fontsize=10)
# 若是修改上面的代碼True 改爲False 那麼線會直接穿過字體
# plt.clabel(C,inline=False,fontsize=10)

# 去掉x,y軸
plt.xticks(())
plt.yticks(())

plt.show()

  

12、image

# 設置一個圖片的數據
a = np.random.random(9).reshape(3, 3)
print(a)

# origin='lower' 換成 origin='upper'
# interpolation='nearest' 顯示的是類別,什麼方式進行顯示
# http://matplotlib.org/examples/images_contours_and_fields/interpolation_methods.html
plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')
# 在旁邊增長一個說明 shrink=0.9 顯示的比例是多少 也就是壓縮
# plt.colorbar()
plt.colorbar(shrink=1.2)

# 去掉x,y軸
plt.xticks(())
plt.yticks(())

plt.show()

  

十3、3D圖像

# 由於是3D圖像咱們須要額外的導入一個庫
from mpl_toolkits.mplot3d import Axes3D

# 創建窗口
fig = plt.figure()
# 在3D上面加上軸
ax = Axes3D(fig)
# x,y數據
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)
# 造成高度值
Z = np.sin(R)
# rstride=1  cstride=1  跨度(行列跨)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
# 等高線圖offset=-2 表示比0點的位置低兩個點
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap='rainbow')
ax.set_zlim(-2, 2)

plt.show()

  

相關文章
相關標籤/搜索