【无标题】

matplotlib.backend_bases.FigureCanvas //画布
matplotlib.backend_bases.Renderer //画笔
matplotlib.artist.Artist //具体的组件
分为primitives 和containers
primitives --> 曲线Line2D,文字text,矩形Rectangle,图像image等
containers --> 图形figure、坐标系Axes和坐标轴Axis

Axes helper methodArtistContainer
bar - bar chartsRectangleax.patches
errorbar - error bar plotsLine2D and Rectangleax.lines and ax.patches
fill - shared areaPolygonax.patches
hist - histogramsRectangleax.patches
imshow - image dataAxesImageax.images
plot - xy plotsLine2Dax.lines
scatter - scatter chartsPolyCollectionax.collections
primitives :
2DLines:
设置属性:
常用参数: 
    xdata:需要绘制的line中点的在x轴上的取值,若忽略,则默认为range(1,len(ydata)+1)
    ydata:需要绘制的line中点的在y轴上的取值
    linewidth:线条的宽度
    linestyle:线型
    color:线条的颜色
    marker:点的标记
    markersize:标记的size
设置方法一:直接在plot()函数中设置
    x = range(0,6)
    y = [2,5,7,8,10,15]
    plt.plot(x,y, linewidth=10); # 设置线的粗细参数为10
设置方法二:通过获得线对象,对线对象进行设置(理解较费劲)
    x = range(0,5)
    y = [2,5,7,8,10]
    line, = plt.plot(x, y, '-') # 这里等号坐标的line,是一个列表解包的操作,目的是获取plt.plot返回列表中的Line2D对象
    line.set_antialiased(False); # 关闭抗锯齿功能
设置方法三:获得线属性,使用setp()函数设置
    x = range(0,5)
    y = [2,5,7,8,10]
    lines = plt.plot(x, y)
    plt.setp(lines, color='r', linewidth=10);
绘制lines
    绘制直线line
    errorbar绘制误差折线图
        #直接绘制:
        x = range(0,5)
        y1 = [2,5,7,8,10]
        y2= [3,6,8,9,11]
        fig,ax= plt.subplots()
        ax.plot(x,y1)
        ax.plot(x,y2)
        print(ax.lines);
        #更具体的画法,相当于为横纵坐标设置了具体值:
        x = range(0,5)
        y1 = [2,5,7,8,10]
        y2= [3,6,8,9,11]
        fig,ax= plt.subplots()
        lines = [Line2D(x, y1), Line2D(x, y2,color='orange')]  # 显式创建Line2D对象
        for line in lines:
            ax.add_line(line) # 使用add_line方法将创建的Line2D添加到子图中
        ax.set_xlim(0,4)
        ax.set_ylim(2, 11);
    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的线条宽度
    样例:
    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, xerr=0.5 ,yerr=5);
Patches(子类,矩形,多边形和楔型):
    Patch(edgecolor=None, facecolor=None,color=None,linewidth=None,linestyle=None, antialiased=None,hatch=None, fill=True, capstyle=None, joinstyle=None, **kwargs)
    Rectangle矩形(xy控制锚点,width和height分别控制宽和高) -->  hist直方图和bar条形图
    
    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,是否为堆积状图
    
    样例:
    x=np.random.randint(0,100,100) #
    数据集前面两个是区间,后者是数量 
    bins=np.arange(0,101,10) #设置直方图的分布区间,1,101是区间,10为间隔
    plt.hist(x,bins,color='fuchsia',alpha=0.5)#alpha设置透明度,0-1之间取值 
    plt.xlabel('scores') 
    plt.ylabel('count') 
    plt.xlim(0,100); #设置x轴分布范围 plt.show() 最后一句到没那么重要
    
    df = pd.DataFrame(columns = ['data'])
    df.loc[:,'data'] = x
    df['fenzu'] = pd.cut(df['data'], bins=bins, right = False,include_lowest=True)
    
    df_cnt = df['fenzu'].value_counts().reset_index()
    df_cnt.loc[:,'mini'] = df_cnt['index'].astype(str).map(lambda x:re.findall('\[(.*)\,',x)[0]).astype(int)
    df_cnt.loc[:,'maxi'] = df_cnt['index'].astype(str).map(lambda x:re.findall('\,(.*)\)',x)[0]).astype(int)
    df_cnt.loc[:,'width'] = df_cnt['maxi']- df_cnt['mini']
    df_cnt.sort_values('mini',ascending = True,inplace = True)
    df_cnt.reset_index(inplace = True,drop = True)
    
    #用Rectangle把hist绘制出来
    
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    
    for i in df_cnt.index:
        rect =  plt.Rectangle((df_cnt.loc[i,'mini'],0),df_cnt.loc[i,'width'],df_cnt.loc[i,'fenzu'])
        ax1.add_patch(rect)
    
    ax1.set_xlim(0, 100)
    ax1.set_ylim(0, 16);
    
    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的标签
    
    bar绘制柱状图
    Rectangle矩形类绘制柱状图
    
    y = range(1,17)plt.bar(np.arange(16), y, alpha=0.5, width=0.5, color='yellow', edgecolor='red', label='The First Bar', lw=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来绘制图形
    x = np.linspace(0, 5 * np.pi, 1000) 
    y1 = np.sin(x)
    y2 = np.sin(2 * x) 
    plt.fill(x, y1, color = "g", alpha = 0.3);

    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的饼图,每个楔子的面积用x/sum(x)表示。
    其中最主要的参数是前4个:

    x:契型的形状,一维数组。
    explode:如果不是等于None,则是一个len(x)数组,它指定用于偏移每个楔形块的半径的分数。
    labels:用于指定每个契型块的标记,取值是列表或为None。
    colors:饼图循环使用的颜色序列。如果取值为None,将使用当前活动循环中的颜色。
    startangle:饼状图开始的绘制的角度。

    样例:
    labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
    sizes = [15, 30, 45, 10] 
    explode = (0, 0.1, 0, 0) 
    fig1, ax1 = plt.subplots() 
    ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90) 
    ax1.axis('equal'); 


wedge绘制饼图

    fig = plt.figure(figsize=(5,5))
    ax1 = fig.add_subplot(111)
    theta1 = 0
    sizes = [15, 30, 45, 10] 
    patches = []
    patches += [
        Wedge((0.5, 0.5), .4, 0, 54),           
        Wedge((0.5, 0.5), .4, 54, 162),  
        Wedge((0.5, 0.5), .4, 162, 324),           
        Wedge((0.5, 0.5), .4, 324, 360),  
    ]
    colors = 100 * np.random.rand(len(patches))
    p = PatchCollection(patches, alpha=0.8)
    p.set_array(colors)
    ax1.add_collection(p);


3. collections

    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: 标记的类型
    样例:
    x = [0,2,4,6,8,10] 
    y = [10]*len(x) 
    s = [20*2**n for n in range(len(x))] 
    plt.scatter(x,y,s=s) ;
    
    images(用法特殊)
    
    class matplotlib.image.AxesImage(ax, cmap=None, norm=None, interpolation=None, origin=None, extent=None, filternorm=True, filterrad=4.0, resample=False, **kwargs)
    样例:
    matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=, filternorm=1, filterrad=4.0, imlim=, resample=None, url=None, *, data=None, **kwargs)
    
    使用imshow画图时首先需要传入一个数组,数组对应的是空间内的像素位置和像素点的值,interpolation参数可以设置不同的差值方法。
    
    methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16',
               'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric',
               'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']
    
    grid = np.random.rand(4, 4)
    
    fig, axs = plt.subplots(nrows=3, ncols=6, figsize=(9, 6),subplot_kw={'xticks': [], 'yticks': []})
    
    for ax, interp_method in zip(axs.flat, methods):
        ax.imshow(grid, interpolation=interp_method, cmap='viridis')
        ax.set_title(str(interp_method))
    
    plt.tight_layout();
    ### 对象容器 - Object container
        容器会包含一些primitives,并且容器还有它自身的属性。
    比如Axes Artist,它是一种容器,它包含了很多primitives,比如Line2D,Text;同时,它也有自身的属性,比如xscal,用来控制X轴是linear还是log的。
    
    1. Figure容器
    matplotlib.figure.Figure是Artist最顶层的container-对象容器,它包含了图表中的所有元素。一张图表的背景就是在Figure.patch的一个矩形Rectangle。
    当我们向图表添加Figure.add_subplot()或者Figure.add_axes()元素时,这些都会被添加到Figure.axes列表中。
    
    fig = plt.figure()
    ax1 = fig.add_subplot(211) # 作一幅2*1的图,选择第1个子图
    ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3]) # 位置参数,四个数分别代表了(left,bottom,width,height)
    print(ax1) 
    print(fig.axes) # fig.axes 中包含了subplot和axes两个实例, 刚刚添加的
    AxesSubplot(0.125,0.536818;0.775x0.343182)
    [<AxesSubplot:>, <matplotlib.axes._axes.Axes object at 0x0000020FD0ED21F0>]
    png
    
    由于Figure维持了current axes,因此你不应该手动的从Figure.axes列表中添加删除元素,而是要通过Figure.add_subplot()、Figure.add_axes()来添加元素,通过Figure.delaxes()来删除元素。但是你可以迭代或者访问Figure.axes中的Axes,然后修改这个Axes的属性。
    
    比如下面的遍历axes里的内容,并且添加网格线:
    
    fig = plt.figure()
    ax1 = fig.add_subplot(211)
    
    for ax in fig.axes:
        ax.grid(True)


Figure也有它自己的text、line、patch、image。你可以直接通过add primitive语句直接添加。但是注意Figure默认的坐标系是以像素为单位,你可能需要转换成figure坐标系:(0,0)表示左下点,(1,1)表示右上点。

    Figure容器的常见属性:
    Figure.patch属性:Figure的背景矩形
    Figure.axes属性:一个Axes实例的列表(包括Subplot)
    Figure.images属性:一个FigureImages patch列表
    Figure.lines属性:一个Line2D实例的列表(很少使用)
    Figure.legends属性:一个Figure Legend实例列表(不同于Axes.legends)
    Figure.texts属性:一个Figure Text实例列表
    
    2. Axes容器
    matplotlib.axes.Axes是matplotlib的核心。大量的用于绘图的Artist存放在它内部,并且它有许多辅助方法来创建和添加Artist给它自己,而且它也有许多赋值方法来访问和修改这些Artist。
    
    和Figure容器类似,Axes包含了一个patch属性,对于笛卡尔坐标系而言,它是一个Rectangle;对于极坐标而言,它是一个Circle。这个patch属性决定了绘图区域的形状、背景和边框。
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    rect = ax.patch  # axes的patch是一个Rectangle实例
    rect.set_facecolor('green')

    Axes有许多方法用于绘图,如.plot()、.text()、.hist()、.imshow()等方法用于创建大多数常见的primitive(如Line2D,Rectangle,Text,Image等等)。在primitives中已经涉及,不再赘述。
    
    Subplot就是一个特殊的Axes,其实例是位于网格中某个区域的Subplot实例。其实你也可以在任意区域创建Axes,通过Figure.add_axes([left,bottom,width,height])来创建一个任意区域的Axes,其中left,bottom,width,height都是[0—1]之间的浮点数,他们代表了相对于Figure的坐标。
    
    你不应该直接通过Axes.lines和Axes.patches列表来添加图表。因为当创建或添加一个对象到图表中时,Axes会做许多自动化的工作:
    它会设置Artist中figure和axes的属性,同时默认Axes的转换;
    它也会检视Artist中的数据,来更新数据结构,这样数据范围和呈现方式可以根据作图范围自动调整。
    
    你也可以使用Axes的辅助方法.add_line()和.add_patch()方法来直接添加。
    
    另外Axes还包含两个最重要的Artist container:
    
    ax.xaxis:XAxis对象的实例,用于处理x轴tick以及label的绘制
    ax.yaxis:YAxis对象的实例,用于处理y轴tick以及label的绘制
    会在下面章节详细说明。
    
    Axes容器的常见属性有:
    artists: Artist实例列表
    patch: Axes所在的矩形实例
    collections: Collection实例
    images: Axes图像
    legends: Legend 实例
    lines: Line2D 实例
    patches: Patch 实例
    texts: Text 实例
    xaxis: matplotlib.axis.XAxis 实例
    yaxis: matplotlib.axis.YAxis 实例

    3. Axis容器
    matplotlib.axis.Axis实例处理tick line、grid line、tick label以及axis label的绘制,它包括坐标轴上的刻度线、刻度label、坐标网格、坐标轴标题。通常你可以独立的配置y轴的左边刻度以及右边的刻度,也可以独立地配置x轴的上边刻度以及下边的刻度。
    
    刻度包括主刻度和次刻度,它们都是Tick刻度对象。
    
    Axis也存储了用于自适应,平移以及缩放的data_interval和view_interval。它还有Locator实例和Formatter实例用于控制刻度线的位置以及刻度label。
    
    每个Axis都有一个label属性,也有主刻度列表和次刻度列表。这些ticks是axis.XTick和axis.YTick实例,它们包含着line primitive以及text primitive用来渲染刻度线以及刻度文本。
    
    刻度是动态创建的,只有在需要创建的时候才创建(比如缩放的时候)。Axis也提供了一些辅助方法来获取刻度文本、刻度线位置等等:
    常见的如下:
    
    # 不用print,直接显示结果
    from IPython.core.interactiveshell import InteractiveShell
    InteractiveShell.ast_node_interactivity = "all"
    
    fig, ax = plt.subplots()
    x = range(0,5)
    y = [2,5,7,8,10]
    plt.plot(x, y, '-')
    
    axis = ax.xaxis # axis为X轴对象
    axis.get_ticklocs()     # 获取刻度线位置
    axis.get_ticklabels()   # 获取刻度label列表(一个Text实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick label。
    axis.get_ticklines()    # 获取刻度线列表(一个Line2D实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick line。
    axis.get_data_interval()# 获取轴刻度间隔
    axis.get_view_interval()# 获取轴视角(位置)的间隔
    [<matplotlib.lines.Line2D at 0x2355fa73310>]
    array([-0.5,  0. ,  0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5])
    [Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, ''),
     Text(0, 0, '')]
    <a list of 22 Line2D ticklines objects>
    array([0., 4.])
    array([-0.2,  4.2])

    下面的例子展示了如何调整一些轴和刻度的属性(忽略美观度,仅作调整参考):
    
    fig = plt.figure() # 创建一个新图表
    rect = fig.patch   # 矩形实例并将其设为黄色
    rect.set_facecolor('lightgoldenrodyellow')
    
    ax1 = fig.add_axes([0.1, 0.3, 0.4, 0.4]) # 创一个axes对象,从(0.1,0.3)的位置开始,宽和高都为0.4,
    rect = ax1.patch   # ax1的矩形设为灰色
    rect.set_facecolor('lightslategray')
    
    
    for label in ax1.xaxis.get_ticklabels(): 
        # 调用x轴刻度标签实例,是一个text实例
        label.set_color('red') # 颜色
        label.set_rotation(45) # 旋转角度
        label.set_fontsize(16) # 字体大小
    
    for line in ax1.yaxis.get_ticklines():
        # 调用y轴刻度线条实例, 是一个Line2D实例
        line.set_color('green')    # 颜色
        line.set_markersize(25)    # marker大小
        line.set_markeredgewidth(2)# marker粗细

    4. Tick容器
    matplotlib.axis.Tick是从Figure到Axes到Axis到Tick中最末端的容器对象。
    Tick包含了tick、grid line实例以及对应的label。
    
    所有的这些都可以通过Tick的属性获取,常见的tick属性有
    Tick.tick1line:Line2D实例
    Tick.tick2line:Line2D实例
    Tick.gridline:Line2D实例
    Tick.label1:Text实例
    Tick.label2:Text实例
    
    y轴分为左右两个,因此tick1对应左侧的轴;tick2对应右侧的轴。
    x轴分为上下两个,因此tick1对应下侧的轴;tick2对应上侧的轴。
    
    下面的例子展示了,如何将Y轴右边轴设为主轴,并将标签设置为美元符号且为绿色:
    
    fig, ax = plt.subplots()
    ax.plot(100*np.random.rand(20))
    
    # 设置ticker的显示格式
    formatter = matplotlib.ticker.FormatStrFormatter('$%1.2f')
    ax.yaxis.set_major_formatter(formatter)
    
    # 设置ticker的参数,右侧为主轴,颜色为绿色
    ax.yaxis.set_tick_params(which='major', labelcolor='green',labelleft=False, labelright=True);
    
    
    
    
    
    思考题1:
        primitives 和 container : 前者提供了基本元素,后者是存放所有元素地方。container可以包含primitives,但他也有自己的属性
        primitives : 线,矩形,多边形,图像等
        container :Figure容器,Axes容器,Axis容器,Tick容器
    思考题2:
        么有drug???
    思考题3:
        图1
        fig = plt.figure()
        ax1 = fig.add_subplot(1,1,1)
        x = np.linspace(0,10,1000)
        y = -(x-2)*(x-8)+10
        ax1.set_xlim(-0.5,10.5)
        ax1.set_ylim(0,20.0)
        ax1.plot(x,y,color='red',linewidth=1)
        for i in np.arange(2,9,0.2):
            pic = plt.Rectangle((i,0),0.1,-(i-2)*(i-8)+10)
            pic.set_color('gray')
            ax1.add_patch(pic)
        图2:
        fig = plt.figure()
        ax1 = fig.add_subplot(1,1,1)
        x = np.linspace(0,10,1000)
        y = -(x-2)*(x-8)+10
        ax1.set_xlim(-0.5,10.5)
        ax1.set_ylim(0,20.0)
        ax1.plot(x,y,color='red',linewidth=2)
        x2 = np.linspace(2,9,1000)
        y2 = -(x2-2)*(x2-8)+10
        ax1.fill_between(x2,0,y2,facecolor='gray')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值