Python matplotlib主要画图函数-统计方面.md

 网络编程     |      2019-11-26

1 制图条形图

运生势况

matplotlib简介

matplotlib是python中用于绘制2D图像,用于科学总计绘图

import matplotlib  # 数据可视化
from matplotlib import pyplot as plt

# 配置字体
matplotlib.rcParams["font.sans-serif"] = ["simhei"]  # 黑体
matplotlib.rcParams["font.family"] = "sans-serif"
'''
left, x轴
height, y轴
width=0.8 ,轴宽
'''
# .bar(x轴, y轴, label=u"标签名", color="颜色")
plt.bar([1], [123], label="广州", color="r")
plt.bar([2], [141], label=u"北京")
plt.bar([3], [11], label=u"上海")
plt.bar([4], [41], label=u"深圳")
plt.bar([5], [181], label=u"香港")
plt.legend()  # 绘图
# plt.show()
plt.savefig("1.jpg")  # 保存图片

由于那是三个Python语言的软件包,因而要求您的机械上第黄金时代安装好Python语言的情况。关于那或多或少,请自行在互联网上查究获得方式。

大旨绘图函数表达和例子

  • barh(bottom, width, height=0.8, left=None, **kwargs)

    • 绘图矩形的边际为:left,left+width,bottom,bottom+height
    • 参数:
      • bottom:标量或数组,是条形图的y轴
      • width:条形图的每叁个带状的宽
      • height:条形的冲天,标量连串,暗中认可是0.8
      • left:条形的左边手的疆界,标量类别,平日是分类的档期的顺序
      • **kwargs:关键字参数,能够钦点图的格式,颜色等等
        • color:标量或许数组,条形的水彩
        • edgecolor:边界的颜色、
        • linewidth:线宽,0正是不画边界
        • tick_label:string恐怕数组,暗中认可是None,刻度的文
        • xerr:标量或许数组,暗许是None,假如不是None那么会画出抽样误差线
        • yerr:类似与xerr
        • align:{‘center’,‘edge’},如若是edge那么垂直条形图条形会在刻度的右边界,水平条形图会对齐底对齐
        • log:暗许是False,轴长度遵照log来
    • 例子:

      import matplotlib.pyplot as plt
      import numpy as np
      import matplotlib.pyplot as plt
      
        plt.rcdefaults()
        fig, ax = plt.subplots()

        # Example data
        people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')
        y_pos = np.arange(len(people))
        performance = 3 + 10 * np.random.rand(len(people))

        ax.barh(y_pos, performance, align='center',
                color='green')
        ax.set_yticks(y_pos) /指明y轴的刻度
        ax.set_yticklabels(people) /指明刻度对应的标签
        ax.invert_yaxis()  # 按照从上往下读的顺序
        ax.set_xlabel('Performance')
        ax.set_title('How fast do you want to go today?')

        plt.show()
  • scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, **kwargs)

    • 绘图散点图
    • 参数
      • x,y:array-like
      • s:点的轻重缓急,默许rcParams['lines.markersize']**2
      • c:color 类别,当是种类的时候,利用cmap,可以是帕杰罗GB
      • marker:标记格式,暗许'o'
      • cmap:私下认可None,如若color类别是floa数组的话就调用Colormap,None:rcimage.cmap
      • norm:规范化color种类,当且仅当color是float数组
      • alpha:透明度
      • edgecolor:边界的颜料
    • 例子:
    import matplotlib.pyplot as plt
    import numpy.random as random
    fig,ax=plt.subplots()
    for color in ['red','green','blue']:
        n=100
        x,y=random.randn(2,n)
        scale=200.0*random.rand(n) #标记的大小
        plt.scatter(x,y,c=color,s=scale,alpha=0.5,edgecolor='none',label=color)
    
    ax.legend() #添加图例
    ax.grid(True) #打开网格
    plt.show()
    
  • 箱线图boxplot(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)

    • 绘制箱线图,查看数据遍及意况和剖断数据是还是不是分布对称
    • 参数
      • x:输入数据,数组也许向量类别
      • notch:bool,暗中认可是False,假诺是True,那么就能够变动带有缺口的箱线图,反映中位数的置信区间
      • sym:flier 点,假如是空字符串的话,那么不会显示flier,假使是None,那么暗中同意flier是‘b+’,假诺想展现越多flier的格式那么要选择flierprops关键字参数,flier:离群点
      • vert:bool 默许True;借使是False,那么箱线图是程度,True就是垂直
      • whis:float,String,sequence,暗中同意是1.5;鲜明平常数据的范围(假诺是类别卡塔 尔(英语:State of Qatar),string=‘range’那么强迫图覆盖最大值到细小;假如是float的话,那么边界点是Q3+whis*(Q3-Q1卡塔尔
      • bootstrap:int
      • manage_xticks:bool 暗中认可是True;当是True的话,自动调治标签和x轴范围
      • meanline:bool 暗许False,若是是True,把均值也画出来
    • 例子:
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Random test data
    np.random.seed(123)
    all_data = [np.random.normal(0, std, 100) for std in range(1, 4)]
    
    fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(9, 4))
    
    # rectangular box plot
    bplot1 = axes[0].boxplot(all_data,
                             vert=True,   # vertical box aligmnent
                             patch_artist=True)   # fill with color
    
    # notch shape box plot
    bplot2 = axes[1].boxplot(all_data,
                             notch=True,  # notch shape
                             vert=True,   # vertical box aligmnent
                             patch_artist=True)   # fill with color
    
    # fill with colors
    colors = ['pink', 'lightblue', 'lightgreen']
    for bplot in (bplot1, bplot2):
        for patch, color in zip(bplot['boxes'], colors):
            patch.set_facecolor(color)
    
    # adding horizontal grid lines
    for ax in axes:
        ax.yaxis.grid(True)
        ax.set_xlabel('xlabel')
        ax.set_ylabel('ylabel')
    
    # add x-tick labels
    plt.setp(axes, xticks=[y+1 for y in range(len(all_data))],
             xticklabels=['x1', 'x2', 'x3', 'x4'])
    
    plt.show()
    
  • 步阶图step(x, y, *args, **kwargs)

    • 宽度积累图
    • 参数
      • x:数组,1-D,日常依次增加
      • y:数组,1-D,经常依次增加
      • Python matplotlib主要画图函数-统计方面.md。where:{'pre','post','mid'}
        pre:默认,x[i]到x[i+1]中间有品位y[i+1]
        post:间距有程度y[i]
        mid:那么y对应的点出现在区间的中等
    • 例子:
    import numpy as np
    from numpy import ma
    import matplotlib.pyplot as plt
    
    x = np.arange(1, 7, 0.4)
    y0 = np.sin(x)
    y = y0.copy() + 2.5
    
    plt.step(x, y, label='pre (default)')
    
    y -= 0.5
    plt.step(x, y, where='mid', label='mid')
    
    y -= 0.5
    plt.step(x, y, where='post', label='post')
    
    y = ma.masked_where((y0 > -0.15) & (y0 < 0.15), y - 0.5)
    plt.step(x, y, label='masked (pre)')
    
    plt.legend()
    
    plt.xlim(0, 7)
    plt.ylim(-0.5, 4)
    
    plt.show()
    
  • pyplot.stem(args,*kwargs)

    • 绘图茎叶图
    • x:array-like
    • y:array-like
    • 能够运用linefmt,markerfmt,basefmt:钦赐baseline的格式,标志的格式,线条的格式
    • 返回(markerline,stemline,baseline)
    • 例子:
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0.1, 2*np.pi, 10)
    markerline, stemlines, baseline = plt.stem(x, np.cos(x), '-.')
    plt.setp(baseline, 'color', 'r', 'linewidth', 2)
    
    plt.show()
    
  • pyplot.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)

    • 绘图饼图,反映部分占总体的百分比
    • 参数
      • x:部分各自占总体的百分比,都以比例只是未有百分号
      • explode:默许None,不为空那么长度断定是len(x卡塔 尔(阿拉伯语:قطر‎,要是中间叁个不为0,别的为0表明该片段供给有个别偏离总体一点,数值钦点离开的比重
      • colors:None,恐怕color系列,连串那颜色会循环填充部分
      • labels:各部分的名目
      • autopct:string或function或None,作为数值申明照旧将数值输出为钦定格式
    • 例子:
    import matplotlib.pyplot as plt
    
    # Pie chart, where the slices will be ordered and plotted counter-clockwise:
    labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
    sizes = [15, 30, 45, 10]
    explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs')
    
    fig1, ax1 = plt.subplots()
    ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
            shadow=True, startangle=90)
    ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
    
    plt.show()
    
  • pyplot.hist(x, bins=None, 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, **kwargs)

    • 制图直方图
    • 参数
      • x:输入值,数组或许n维数组体系
      • bins:面元个数 integer只怕数组也许auto,借使是Integer,那么将会生出bins+1 个面元
        数组,那么面元时间可能不等于
      • range:面元的节制,假如None,那么正是(x.min(),x.max())
      • normed:假使是True,那么绘制频率分布直方图的时候,就能自动中度=频数/len(x)
      • cumulative:积攒直方图,默许是False,要是是True那么绘制积存直方图
      • stacked:暗许False,三个数据堆集在同步,False:多个数据并列排在一条线
      • histtype:{'bar','barstacked','step','stepfilled'}
        bar:条形
        barstacked:条形堆叠图
        step:生成一个线图且未有填写
        stepfilled:生成二个填充线图
    • 例子:
    import numpy as np
    import matplotlib.pyplot as plt
    
    np.random.seed(0)
    
    mu = 200
    sigma = 25
    x = np.random.normal(mu, sigma, size=100)
    
    fig, (ax0, ax1) = plt.subplots(ncols=2, figsize=(8, 4))
    
    ax0.hist(x, 20, normed=1, histtype='stepfilled', facecolor='g', alpha=0.75)
    ax0.set_title('stepfilled')
    
    # Create a histogram by providing the bin edges (unequally spaced).
    bins = [100, 150, 180, 195, 205, 220, 250, 300]
    ax1.hist(x, bins, normed=1, histtype='bar', rwidth=0.8)
    ax1.set_title('unequal bins')
    
    fig.tight_layout()
    plt.show()
    

2 绘制智联合招生聘职位岗位数量图

有关什么设置Matplotlib请参见这里:Matplotlib Installing。

python
import urllib.request
import urllib.parse
import re
import matplotlib
import matplotlib.pyplot as plt  # 数据可视化

matplotlib.rcParams["font.sans-serif"] = ["simhei"]  # 配置字体
matplotlib.rcParams["font.family"] = "sans-serif"
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}

def getnumberbyname(searchname):
    searchname = {"kw": searchname}
    searchname = urllib.parse.urlencode(searchname)
    url = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E6%B7%B1%E5%9C%B3&" + searchname + "&p=1&isadv=0"
    print(url, '==========')
    req = urllib.request.Request(url, headers=header)
    pagesource = urllib.request.urlopen(req).read().decode('utf-8', 'ignore')
    restr = "<em>(\d+)</em>"  # 正则表达式,()只要括号内的数据
    regex = re.compile(restr, re.IGNORECASE)
    mylist = regex.findall(pagesource)
    return mylist[0]
# 岗位列表
pythonlist = ["python", "python 运维", "python 测试", "python 数据", "python web"]
num = 0
for pystr in pythonlist:
    num += 1
    print(pystr, eval(getnumberbyname(pystr)))
    # 绘制柱状图
    plt.bar([num], eval(getnumberbyname(pystr)), label=pystr)

plt.legend()  # 绘制
plt.show()  # 显示

小编推荐大家通过pip的法子展开设置,具体方法如下:

3 词云

“词云”这几个定义由U.S.西大音讯学副教师、新媒体育专科学园业主任Richie·Gordon(Rich Gordon卡塔尔国建议。“词云”就是对网络文本中现身频率较高的“关键词”予以视觉上的凸起,产生“关键词云层”或“关键词渲染”,进而过滤掉大批量的文书音信,使浏览网页者只要一眼扫过文本就能够明白文本的宏旨。

  • 词频
  • 分词 语句切割
python
import jieba
mystr = "小姐姐,我看你挺能睡的,睡我还不好"

wordsplitList = jieba.cut(mystr, cut_all=True) # 切割, 全部切割
print(wordsplitList) # 返回一个生成器对象
print('/'.join(wordsplitList))
wordsplitListforSearch = jieba.cut_for_search(mystr) # 按搜索方式切割
print(wordsplitListforSearch)

print('/'.join(wordsplitListforSearch))
- 制作python岗位需求词云
python
import wordcloud  导入词云
from wordcloud import STOPWORDS  # 停止词
import jieba
import numpy as np  # 科学计算
import matplotlib  # 数据可视化
from matplotlib import pyplot as plt
from PIL import Image  # 图片处理
sudo pip3 install matplotlib

读取文本

pythonInfo = open('pythonworkinfo.txt', 'r', encoding='utf-8', errors='ignore').read()
print(pythonInfo)

本文中的源码和测量检验数据足以在这里间得到:matplotlib_tutorial

切割

pythonCut = jieba.cut(pythonInfo, cut_all=True)
pythonInfoList = ' '.join(pythonCut)  # 返回一个生成器对象
print(pythonInfoList)
backgroud = np.array(Image.open('pig.jpg'))  # 将图片格式化成RBG数组
myCloudword = wordcloud.WordCloud(font_path='simkai.ttf',  # 字体路径
                                  width=400, height=200,
                                  mask=backgroud,  # 字体颜色
                                  scale=1,  # 比例
                                  max_words=200,  # 最大字数
                                  min_font_size=4,  # 最小字体
                                  stopwords=STOPWORDS,  # 默认停止词
                                  random_state=50,  # 随机角度
                                  background_color='black',  # 背景颜色
                                  max_font_size=100  # 最大字体
                                  ).generate(pythonInfoList)
#plt.imshow(myCloudword)
#plt.show()  图片展示
plt.figimage(mywordCloud)   #绘制图片
plt.imsave('python.png',mywordCloud)  #保存图片

正文的代码示例会用到此外一个Python库:NumPy。建议读者先对NumPy有必然的耳熟能详,作者前边也写过叁个NumPy的幼功教程,参见这里:Python 机器学习库 NumPy 教程。

轻易生成词云

import matplotlib.pyplot as plt
from wordcloud import WordCloud
import jieba

text_from_file_with_apath = open('pythonworkinfo.txt',encoding='utf-8',errors='ignore').read()
print(text_from_file_with_apath)
wordlist_after_jieba = jieba.cut(text_from_file_with_apath, cut_all=True)

wl_space_split = " ".join(wordlist_after_jieba)
my_wordcloud = WordCloud().generate(wl_space_split)

plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()

#注:碰到utf-8的编码问题时候,可以去源码wordcloud.py文件中新增路径,前提下好中文字体库simkai.ttf
FONT_PATH = os.environ.get("FONT_PATH", os.path.join(os.path.dirname(__file__), "simkai.ttf"))
覆盖掉默认的DroidSansMono.ttf

正文的代码在如下情形中测量试验:

4 Matplotlib 绘图

1 多个subplot

# subplot.py

import matplotlib.pyplot as plt
import numpy as np

data = np.arange(100, 201)
plt.subplot(2, 1, 1)
plt.plot(data)

data2 = np.arange(200, 301)
plt.subplot(2, 1, 2)
plt.plot(data2)

plt.show()

澳门太阳集团2007网站 1

2 线形图

# plot.py
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [3, 6, 9], '-r')
plt.plot([1, 2, 3], [2, 4, 9], ':g')

plt.show()

澳门太阳集团2007网站 2

这段代码表达如下:

  1. plot函数的首先个数组是横轴的值,第二个数组是纵轴的值,所以它们多少个是直线,叁个是折线;
  2. 终极二个参数是由多个字符构成的,分别是线条的体裁和颜色。前面四个是乙丑革命的直线,前者是珍珠白的点线。

3 散点图

# scatter.py

import matplotlib.pyplot as plt
import numpy as np 
N = 20
plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c='r', s=100, alpha=0.5)

plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c='g', s=200, alpha=0.5)

plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c='b', s=300, alpha=0.5)
plt.show()

澳门太阳集团2007网站 3

这段代码表明如下:

  1. 这幅图满含了三组数据,每组数据都满含了二十一个随机坐标之处
  2. 参数c代表点的颜色,s是点的尺寸,alpha是折射率

4 饼状图

# pie.py
import matplotlib.pyplot as plt
import numpy as np

labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
data = np.random.rand(7) * 100

plt.pie(data, labels=labels, autopct='%1.1f%%')
plt.axis('equal')
plt.legend()

plt.show()

澳门太阳集团2007网站 4

这段代码表达如下:

  1. data是风流罗曼蒂克组包括7个数据的任性数值
  2. 图中的标签通过labels来指定
  3. autopct钦定了数值的精度格式
  4. plt.axis('equal')安装了坐标轴大小相同
  5. plt.legend()指明要绘制图例(见下图的右上角卡塔尔国

5 条形图

# bar.py

import matplotlib.pyplot as plt
import numpy as np
N = 7
x = np.arange(N)
data = np.random.randint(low=0, high=100, size=N)
colors = np.random.rand(N * 3).reshape(N, -1)
labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

plt.title("Weekday Data")
plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels)
plt.show()

澳门太阳集团2007网站 5

这段代码表明如下:

  1. 这幅图展现了意气风发组蕴含7个随机数值的结果,每一种数值是[0, 100]的即兴数
  2. 它们的水彩也是因此随机数变化的。np.random.rand(N * 3).reshape(N, -1)表示先生成21(N x 3卡塔尔个随机数,然后将它们组装成7行,那么每行正是五个数,那对应了颜色的多个组成都部队分。如若不清楚这行代码,请先读书一下Python 机器学习库 NumPy 教程
  3. title点名了图片的标题,labels点名了标签,alpha是折射率

6 直方图

# hist.py

import matplotlib.pyplot as plt
import numpy as np

data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
labels = ['3K', '4K', '5K']
bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000]

plt.hist(data, bins=bins, label=labels)
plt.legend()

plt.show()

澳门太阳集团2007网站 6

上边这段代码中,[np.random.randint(0, n, n) for n in [3000, 4000, 5000]]变化了带有了八个数组的数组,这里面:

  • 先是个数组包括了3000个随机数,这一个随便数的范围是 [0, 3000)
  • 澳门太阳集团2007网站 ,其次个数组蕴含了4000个随机数,这个自由数的限量是 [0, 4000)
  • 其四个数组包罗了5000个随机数,那一个随机数的节制是 [0, 5000)
  • Apple OS X 10.13
  • Python 3.6.3 matplotlib 2.1.1
  • numpy 1.13.3

介绍

Matplotlib适用于种种境遇,包含:

  • Python脚本
  • IPython shell Jupyter notebook
  • Web应用服务器
  • 客户图形分界面工具包

行使Matplotlib,能够的即兴转变各种类型的图像,举例:直方图,波谱图,条形图,散点图等。並且,可以拾壹分轻易的落到实处定制。

入门代码示例

下边大家先看二个最简便的代码示例,让我们心得一下Matplotlib是怎么着的:

# test.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.plot(data)
plt.show()

这段代码的着注重逻辑独有三行,不过它却绘制出了二个要命直观的线性图,如下所示:

澳门太阳集团2007网站 7

相比较着这么些线形图,我们来说学一下三行代码的逻辑:

  • 通过np.arange(100, 201)调换一个[100, 200]时期的莫西干发型数组,它的值是:[100, 101, 102, … , 200]
  • 通过matplotlib.pyplot将其绘制出来。很鲜明,绘制出来的值对应了图中的纵坐标(y轴卡塔 尔(英语:State of Qatar)。而matplotlib自身为大家设置了图片的横坐标(x轴卡塔 尔(英语:State of Qatar):[0, 100],因为大家偏巧有九十三个数值
  • 通过plt.show()将那些图形呈现出来

这段代码非常的简要,运维起来也是同等。假设您早原来就有了本文的周转蒙受,将地方的代码保存到二个文本文件中(或许经过Github拿到本文的源码卡塔尔国,然后经过上面包车型大巴通令就能够在你和煦的微处理机上收看地点的图纸了:

python3 test.py

注1:后边的课程中,大家会日益疏解怎样定制图中的每三个细节。举例:坐标轴,图形,着色,线条样式,等等。

注2:若无供给,下文的截图会去掉图形外侧的边框,只保留图形主体。

贰回绘制八个图形

些微时候,大家大概希望三回绘制多个图形,举个例子:两组数据的比较,恐怕豆蔻梢头组数据的例外展现方式等。

能够经过下边包车型大巴情势创设多少个图形:

多个figure

能够简单的明白为一个figure正是一个图片窗口。matplotlib.pyplot会有贰个私下认可的figure,大家也得以因此plt.figure()创办更多少个。如上边包车型地铁代码所示:

# figure.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.plot(data)
data2 = np.arange(200, 301)
plt.figure()
plt.plot(data2)
plt.show()

这段代码绘制了五个窗口的图样,它们各自是三个两样间距的线形图,如下所示:

澳门太阳集团2007网站 8