Day two:matplotlib

matplotlib的原理或者说基础逻辑是,用Artist对象在画布(canvas)上绘制(Render)图形。

而Artist对象又分为两类:primitives 和containers

primitive是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。

container是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis

Day two:matplotlib_第1张图片

 所以说matplotlib的使用流程先要创建一个figure对象,可以理解为画布,然后在画布上画上axes(坐标系),坐标系是一种容器在容器中,可以添加primitive(要素)。

值得一提的是,Axes是一种容器,它可能是matplotlib API中最重要的类,并且我们大多数时间都花在和它打交道上。

figure容器

由于matplotlib绘画的逻辑是在figure,axes等容器上添加primitives。

atplotlib.figure.FigureArtist最顶层的container-对象容器,它包含了图表中的所有元素。一张图表的背景就是在Figure.patch的一个矩形Rectangle
当我们向图表添加Figure.add_subplot()或者Figure.add_axes()元素时,这些都会被添加到Figure.axes列表中。

fig=plt.figure() #创建一个figure容器
sub=fig.add_subplot(2,1,1)#创建了一个两行一列(即可以有两个subplot)的绘图区,并同时在第一个位置创建了一个subplot
x=np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*x)#创建数据
line = sub.plot(x, s, color='blue', lw=2)

                   Day two:matplotlib_第2张图片

基本元素 - primitives

  像曲线-Line2D,矩形-Rectangle,图像-image 都是比较常见的基本元素

1.Line2D

  在matplotlib中曲线的绘制,主要是通过类 matplotlib.lines.Line2D 来完成的。

它的构造函数为:

class matplotlib.lines.Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None, markersize=None, markeredgewidth=None, markeredgecolor=None, markerfacecolor=None, markerfacecoloralt='none', fillstyle=None, antialiased=None, dash_capstyle=None, solid_capstyle=None, dash_joinstyle=None, solid_joinstyle=None, pickradius=5, drawstyle=None, markevery=None, **kwargs)

常用的有

  • xdata:需要绘制的line中点的在x轴上的取值,若忽略,则默认为range(1,len(ydata)+1)

  • ydata:需要绘制的line中点的在y轴上的取值

  • linewidth:线条的宽度

  • linestyle:线型

  • color:线条的颜色

  • marker:点的标记,详细可参考markers API

  • markersize:标记的size

可以通过以下三种方式创建线的属性

    1.直接在plot()函数中设置

import matplotlib.pyplot as plt
x = np.arange(0.0, 1.0, 0.01)
y = np.sin(2*np.pi*t)
plt.plot(x,y, lw=2,color='red'); # 设置线的粗细参数为10,颜色为red

     2.通过获得线对象,对线对象进行设置

x = np.arange(0.0, 1.0, 0.01)
y = np.sin(2*np.pi*t)
line ,= plt.plot(x, y, '--')# 虚线
line.set_antialiased(False) # 关闭抗锯齿功能

 这里 line后面加逗号是为了把plot返回的元组拆包,获取第一个元素

     3.获得线属性,使用setp()函数设置

x = np.arange(0.0, 1.0, 0.01)
y = np.sin(2*np.pi*t)
lines = plt.plot(x, y)
plt.setp(lines, color='r', linewidth=10);

 以上是运用plot的方法绘制直线,还有另外一种方法,lin2D对象绘制。

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D      

fig = plt.figure() #创建figure
ax = fig.add_subplot(111)#创建一行一列的绘图区,并在第一个位置创建了一个subplot
line = Line2D(x, y)
ax.add_line(line)
ax.set_xlim(min(x), max(x))  #x坐标轴从min(x),到max(x)
ax.set_ylim(min(y), max(y))

plt.show()

其中 fig.add_subplot(111) 是创建一行一列的绘图区,并在第一个位置创建了一个subplot。

  其中 ax.set_xlim(min(x), max(x))  表示 x坐标轴范围从min(x),到max(x)

绘制errorbar误差折线图

pyplot里有个专门绘制误差线的功能,通过errorbar类实现,它的构造函数:

matplotlib.pyplot.errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, elinewidth=None, capsize=None, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, errorevery=1, capthick=None, *, data=None, **kwargs)

其中最主要的参数是前几个:

  • x:需要绘制的line中点的在x轴上的取值

  • y:需要绘制的line中点的在y轴上的取值

  • yerr:指定y轴水平的误差

  • xerr:指定x轴水平的误差

  • fmt:指定折线图中某个点的颜色,形状,线条风格,例如‘co--’

  • ecolor:指定error bar的颜色

  • elinewidth:指定error bar的线条宽度

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
x = np.arange(10)
y = 2.5 * np.sin(x / 20 * np.pi)
yerr = np.linspace(0.05, 0.2, 10)
plt.errorbar(x, y + 3, yerr=yerr, label='both limits (default)');

y轴水平误差为yerr。

2.patches

  matplotlib.patches.Patch类是二维图形类。它的基类是matplotlib.artist.Artist,它的构造函数:
详细清单见 matplotlib.patches API

Patch(edgecolor=None, facecolor=None, color=None, linewidth=None, linestyle=None, antialiased=None, hatch=None, fill=True, capstyle=None, joinstyle=None, **kwargs)

  a. Rectangle-矩形

Rectangle矩形类在官网中的定义是: 通过锚点xy及其宽度和高度生成。 Rectangle本身的主要比较简单,即xy控制锚点,width和height分别控制宽和高。它的构造函数:

class matplotlib.patches.Rectangle(xy, width, height, angle=0.0, **kwargs)

在实际中最常见的矩形图是hist直方图bar条形图

     (1).hist直方图

matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid', log=False, color=None, label=None, stacked=False, normed=None)

下面是一些常用的参数:

  • x: 数据集,最终的直方图将对数据集进行统计
  • bins: 统计的区间分布
  • range: tuple, 显示的区间,range在没有给出bins时生效
  • density: bool,默认为false,显示的是频数统计结果,为True则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和normed效果一致,官方推荐使用density
  • histtype: 可选{'bar', 'barstacked', 'step', 'stepfilled'}之一,默认为bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似
  • align: 可选{'left', 'mid', 'right'}之一,默认为'mid',控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认
  • log: bool,默认False,即y坐标轴是否选择指数刻度
  • stacked: bool,默认为False,是否为堆积状图
    import matplotlib.pyplot as plt
    import numpy as np 
    x=np.random.randint(0,100,10) #生成[0-100)之间的100个数据,即 数据集 
    bins=np.arange(0,101,10) #设置连续的边界值,即直方图的分布区间[0,10),[10,20)... 
    plt.hist(x,bins,color='pink',alpha=0.5)#alpha设置透明度,0为完全透明 
    plt.xlabel('scores') 
    plt.ylabel('count') 
    plt.xlim(0,100)#设置x轴分布范围 plt.show()
    print(bins)

    直方图的纵坐标为落入到数据集落入到区间(bins)的数量

     (2)bar 柱状图

  • matplotlib.pyplot.bar(left, height, alpha=1, width=0.8, color=, edgecolor=, label=, lw=3)

    下面是一些常用的参数:

  • left:x轴的位置序列,一般采用range函数产生一个序列,但是有时候可以是字符串
  • height:y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据;
  • alpha:透明度,值越小越透明
  • width:为柱形图的宽度,一般这是为0.8即可;
  • color或facecolor:柱形图填充的颜色;
  • edgecolor:图形边缘颜色
  • label:解释每个图像代表的含义,这个参数是为legend()函数做铺垫的,表示该次bar的标签
import matplotlib.pyplot as plt
y = range(1,17)
plt.bar(np.arange(16), y, alpha=0.8, width=1, color='blue', edgecolor='white', label='The second Bar', lw=4)

Day two:matplotlib_第3张图片

 b. Polygon-多边形

构造函数为         class matplotlib.patches.Polygon(xy, closed=True, **kwargs)

其中  xy是一个N×2的numpy array,为多边形的顶点。
         closed为True则指定多边形将起点和终点重合从而显式关闭多边形。

matplotlib.patches.Polygon类中常用的是fill类,它是基于xy绘制一个填充的多边形,它的定义:

matplotlib.pyplot.fill(*args, data=None, **kwargs)

参数说明 : 关于x、y和color的序列,其中color是可选的参数,每个多边形都是由其节点的x和y位置列表定义的,后面可以选择一个颜色说明符。您可以通过提供多个x、y、[颜色]组来绘制多个多边形。

# 用fill来绘制图形
import matplotlib.pyplot as plt
x = np.linspace(0, 5 * np.pi, 1000) 
y1 = np.sin(x)
y2 = np.sin(2 * x) 
plt.fill(x, y2, color = "b", alpha = 0.8);

Day two:matplotlib_第4张图片

 c. Wedge-契形

   

class matplotlib.patches.Wedge(center, r, theta1, theta2, width=None, **kwargs)

一个Wedge-契形 是以坐标x,y为中心,半径为r,从θ1扫到θ2(单位是度)。
如果宽度给定,则从内半径r -宽度到外半径r画出部分楔形。wedge中比较常见的是绘制饼状图。

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)

  • x:契型的形状,一维数组。

  • explode:如果不是等于None,则是一个len(x)数组,它指定用于偏移每个楔形块的半径的分数。

  • labels:用于指定每个契型块的标记,取值是列表或为None。

  • colors:饼图循环使用的颜色序列。如果取值为None,将使用当前活动循环中的颜色。

  • startangle:饼状图开始的绘制的角度。

如下所示,数据为size,数据偏移量为explode,有阴影,开始绘制角度为0;

import matplotlib.pyplot as plt 
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10] 
explode = (0, 0.2,0, 0) 
fig1=plt.figure()
ax1=fig1.add_subplot(111)
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=0) #
ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle. 

Day two:matplotlib_第5张图片

 散点图的绘制

   Axes.scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)

重要的参数主要有

  • x:数据点x轴的位置

  • y:数据点y轴的位置

  • s:尺寸大小

  • c:可以是单个颜色格式的字符串,也可以是一系列颜色

  • marker: 标记的类型

    # 用scatter绘制散点图
    x = [0,2,4,6,8,10] 
    y = np.linspace(0,1,len(x))*len(x) 
    s = [20*2**n for n in range(len(x))] 
    plt.scatter(x,y,s=s,c=np.random.randn(len(x))) 
    plt.show()
    

    Day two:matplotlib_第6张图片

     

你可能感兴趣的:(笔记,python,matplotlib)