zoukankan      html  css  js  c++  java
  • matplotlib 巩固 -> 网上

    灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为R,G,B三个分量,
    分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程。
    灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素最下为0,为黑色)。 图像灰度化的算法主要有以下3种:

    data2 = data.mean(axis = 2)

     

    data3 = np.dot(data,[0.299,0.587,0.114])
    Matplotlib中的基本图表包括的元素
    
    
    x轴和y轴
    水平和垂直的轴线
    
    x轴和y轴刻度
    刻度标示坐标轴的分隔,包括最小刻度和最大刻度
    
    x轴和y轴刻度标签
    表示特定坐标轴的值
    
    绘图区域
    实际绘图的区域
    绘制一条曲线
    
    x = np.arange(0.0,6.0,0.01)
    plt.plot(x, x**2)
    plt.show()
    绘制多条曲线
    
    x = np.arange(1, 5,0.01)
    plt.plot(x, x**2)
    plt.plot(x, x**3.0)
    plt.plot(x, x*3.0)
    plt.show()
    
    
    x = np.arange(1, 5)
    plt.plot(x, x*1.5, x, x*3.0, x, x/3.0)
    plt.show()
    绘制网格线
    
    设置grid参数(参数与plot函数相同)
    lw代表linewidth,线的粗细
    alpha表示线的明暗程度
    
    # 使用子图显示不同网格线对比
    fig  = plt.figure(figsize=(20,3))
    
    x = np.linspace(0, 5, 100)
    
    # 使用默认网格设置
    ax1 = fig.add_subplot(131)
    ax1.plot(x, x**2, x, x**3,lw=2) 
    ax1.grid(True) # 显式网格线
    
    # 对网格线进行设置
    ax2 = fig.add_subplot(132)
    ax2.plot(x, x**2, x, x**4, lw=2)
    ax2.grid(color='r', alpha=0.5, linestyle='dashed', linewidth=0.5) 
    # grid函数中用与plot函数同样的参数设置网格线 # 对网格线进行设置 ax3 = fig.add_subplot(133) ax3.plot(x, x**2, x, x**4, lw=2) ax3.grid(color='r', alpha=0.5, linestyle='-.', linewidth=0.5)
    # grid函数中用与plot函数同样的参数设置网格线
    坐标轴界限 axis 方法
    
    x = np.arange(1, 5)
    plt.plot(x, x*1.5, x, x*3.0, x, x/3.0)
    # plt.axis() # shows the current axis limits values;
    如果axis方法没有任何参数,则返回当前坐标轴的上下限 # (1.0, 4.0, 0.0, 12.0) # plt.axis([0, 15, -5, 13]) # set new axes limits;
    axis方法中有参数,设置坐标轴的上下限;参数顺序为[xmin, xmax, ymin, ymax] plt.axis(xmax=5,ymax=23) # 可使用xmax,ymax参数 plt.show() 设置紧凑型坐标轴 x = np.arange(1, 5) plt.plot(x, x*1.5, x, x*3.0, x, x/3.0) plt.axis('tight') # 紧凑型坐标轴 plt.show() plt除了axis方法设置坐标轴范围,还可以通过xlim,ylim设置坐标轴范围 x = np.arange(1, 5) plt.plot(x, x*1.5, x, x*3.0, x, x/3.0) plt.xlim([0, 5]) # ylim([ymin, ymax]) plt.ylim([-1, 13]) # xlim([xmin, xmax]) plt.show()
    坐标轴标签
    
    plt.plot([1, 3, 2, 4])
    plt.xlabel('This is the X axis')
    plt.ylabel('This is the Y axis')
    plt.show()
    坐标轴标题
    
    plt.plot([1, 3, 2, 4])
    plt.title('Simple plot')
    plt.show()
    label参数为'_nolegend_',则图例中不显示
    
    
    x = np.arange(1, 5)
    plt.plot(x, x*1.5, label = '_nolegend_') 
    # label参数为'_nolegend_',则图例中不显示 plt.plot(x, x*3.0, label='Fast') plt.plot(x, x/3.0, label='Slow') plt.legend() plt.show()

     

    图例 legend
    
    legend方法
    两种传参方法:
    
    
    【推荐使用】在plot函数中增加label参数
    在legend方法中传入字符串列表
    
    方法一:
    x = np.arange(1, 5)
    plt.plot(x, x*1.5, label='Normal') # 在plot函数中增加label参数
    plt.plot(x, x*3.0, label='Fast')
    plt.plot(x, x/3.0, label='Slow')
    plt.legend()
    plt.show()
    
    方法二:
    x = np.arange(1, 5)
    plt.plot(x, x*1.5)
    plt.plot(x, x*3.0)
    plt.plot(x, x/3.0)
    plt.legend(['Normal', 'Fast', 'Slow']) # 在legend方法中传入字符串列表
    plt.show()
    loc 参数
    
    x = np.arange(1, 5)
    plt.plot(x, x*1.5, label='Normal')
    plt.plot(x, x*3.0, label='Fast')
    plt.plot(x, x/3.0, label='Slow')
    plt.legend(loc=10)
    plt.show()

     

     

    loc参数可以是2元素的元组,表示图例左下角的坐标
    
    x = np.arange(1, 5)
    plt.plot(x, x*1.5, label='Normal')
    plt.plot(x, x*3.0, label='Fast')
    plt.plot(x, x/3.0, label='Slow')
    plt.legend(loc=(0,1)) # loc参数可以是2元素的元组,表示图例左下角的坐标
    plt.show()

     

    ncol参数控制图例中有几列
    
    x = np.arange(1, 5)
    plt.plot(x, x*1.5, label='Normal')
    plt.plot(x, x*3.0, label='Fast')
    plt.plot(x, x/3.0, label='Slow')
    plt.legend(loc=0, ncol=2) # ncol控制图例中有几列
    plt.show()

     

    linestyle 属性
    
    plt.plot(np.random.randn(1000).cumsum(), linestyle = ':',marker = '.', label='one')
    plt.plot(np.random.randn(1000).cumsum(), 'r--', label='two') 
    plt.plot(np.random.randn(1000).cumsum(), 'b.', label='three')
    plt.legend(loc='best') # loc='best'
    plt.show()

     

    保存图片
    
    filename
    含有文件路径的字符串或Python的文件型对象。图像格式由文件扩展名推断得出,
    例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……) dpi 图像分辨率(每英寸点数),默认为100 facecolor 图像的背景色,默认为“w”(白色) x = np.random.randn(1000).cumsum() fig = plt.figure(figsize = (10,3)) splt = fig.add_subplot(111) splt.plot(x) fig.savefig(filename = "filena.eps",dpi = 100,facecolor = 'g')
    设置plot的风格和样式
    点和线的样式
    颜色
    
    参数color或c
    
    五种定义颜色值的方式
    
    别名
    color='r'
    
    合法的HTML颜色名
    color = 'red'
    
    HTML十六进制字符串
    color = '#eeefff'
    
    归一化到[0, 1]的RGB元组
    color = (0.3, 0.3, 0.4)
    
    灰度
    color = (0.1)

     

    透明度
    
    y = np.arange(1, 3)
    plt.plot(y, c="red", alpha=0.1);    # 设置透明度
    plt.plot(y+1, c="red", alpha=0.5);
    plt.plot(y+2, c="red", alpha=0.9);
    设置背景色
    通过plt.subplot()方法传入facecolor参数,来设置坐标轴的背景色
    
    plt.subplot(facecolor='orange');
    plt.plot(np.random.randn(10),np.arange(1,11))

     


    线型

     

    不同宽度破折线
    
    # 第一段线2个点的宽度,接下来的空白区5个点的宽度,第二段线5个点的宽度,空白区2个点的宽度,以此类推
    plt.plot(np.linspace(-np.pi, np.pi, 256, endpoint=True),
             np.cos(np.linspace(-np.pi, np.pi, 256, endpoint=True)), 
             dashes=[2, 5, 5, 2]);

     

    点型 
    
    y = np.arange(1, 3, 0.2)
    plt.plot(y, '1', y+0.5, '2', y+1, '3', y+1.5,'4');
    plt.plot(y+2, '3') #不声明marker,默认ls = None
    plt.plot(y+2.5,marker = '3') #声明了marker,ls 默认是实线
    plt.show()

     

    多参数连用
    
    颜色、点型、线型
    
    x = np.linspace(0, 5, 10)
    plt.plot(x,3*x,'r-.')
    plt.plot(x, x**2, 'b^:') # blue line with dots
    plt.plot(x, x**3, 'go-.') # green dashed line
    plt.show()

     

    更多点和线的设置
    
    y = np.arange(1, 3, 0.3)
    plt.plot(y, color='blue', 
             linestyle='dashdot', 
             linewidth=4, marker='o',
             markerfacecolor='red', 
             markeredgecolor='black', 
             markeredgewidth=3, 
             markersize=12);
    plt.show()

     

    在一条语句中为多个曲线进行设置
    
    多个曲线同一设置¶
    plt.plot(x1, y1, x2, y2, fmt, ...)
    
    
    多个曲线不同设置¶
    plt.plot(x1, y1, fmt1, x2, y2, fmt2, ...)

     

    在一条语句中为多个曲线进行设置
    
    
    多个曲线同一设置¶
    plt.plot(x1, y1, x2, y2, fmt, ...)
    
    
    多个曲线不同设置¶
    plt.plot(x1, y1, fmt1, x2, y2, fmt2, ...)
    三种设置方式
    
    向方法传入关键字参数
    
    
    对实例使用一系列的setter方法
    
    x = np.arange(0,10)
    y = np.random.randint(10,30,size = 10)
    line,= plt.plot(x, y)
    line2 = plt.plot(x,y*2,x,y*3)
    line.set_linewidth(5)
    line2[1].set_marker('o')
    print(line,line2)
    
    
    使用setp()方法
    line = plt.plot(x, y)
    plt.setp(line, 'linewidth', 1.5,'color','r','marker','o','linestyle','--')
    X、Y轴坐标刻度
    xticks()和yticks()方法
    
    x = [5, 3, 7, 2, 4, 1]
    plt.plot(x);
    plt.xticks(range(len(x)), ['a', 'b', 'c', 'd', 'e', 'f']); # 传入位置和标签参数,以修改坐标轴刻度
    plt.yticks(range(1, 8, 2));
    plt.show()

     

    面向对象方法
    
    set_xticks、set_yticks、set_xticklabels、set_yticklabels方法
    
    
    fig = plt.figure(figsize=(10, 4))
    ax = fig.add_subplot(111)
    
    x = np.linspace(0, 5, 100)
    
    ax.plot(x, x**2, x, x**3, lw=2)
    
    ax.set_xticks([1, 2, 3, 4, 5])
    ax.set_xticklabels(['a','b','c','d','e'], fontsize=18)
    
    yticks = [0, 50, 100, 150]
    ax.set_yticks(yticks)
    ax.set_yticklabels([y for y in yticks], fontsize=18); # use LaTeX formatted labels

     

    正弦余弦:LaTex语法,用$pi$等表达式在图表上写上希腊字母
    
    x = np.arange(-np.pi,np.pi,0.01)
    plt.figure(figsize=(12,9))
    plt.plot(x,np.sin(x),x,np.cos(x))
    
    plt.axis([x.min()-1,x.max()+1,-1.2,1.2])
    
    #xticks:参数一刻度,参数二,对应刻度上的值
    plt.xticks(np.arange(-np.pi,np.pi+1,np.pi/2),
               ['$-delta$','$-pi$/2','0','$pi$/2','$pi$'],size = 20)
    
    plt.yticks([-1,0,1],['min','0','max'],size = 20)
    
    plt.show() 

    四图
    直方图
    
    【直方图的参数只有一个x!!!不像条形图需要传入x,y】
    hist()的参数
    bins
    可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10
    normed
    如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False
    color
    指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,
    颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色 orientation 通过设置orientation为horizontal创建水平直方图。默认值为vertical x = np.random.randint(5,size = 5) display(x) plt.hist(x,histtype = 'bar'); # 默认绘制10个bin plt.show()
    普通直方图/累计直方图
    
    n = np.random.randn(10000)
    
    fig,axes = plt.subplots(1,2,figsize = (12,4))
    axes[0].hist(n,bins = 50)#普通直方图
    axes[0].set_title('Default histogram')
    axes[0].set_xlim(min(n),max(n))
    
    axes[1].hist(n,bins = 50,cumulative = True)# 累计直方图
    axes[1].set_title('Cumulative detailed histogram')
    axes[1].set_xlim(min(n),max(n))

     

    正太分布
    
    u = 100 #数学期望
    s = 15 #方差
    x = np.random.normal(u,s,1000) # 生成正太分布数据
    
    ax = plt.gca() #获取当前图表
    ax.set_xlabel('Value')
    ax.set_ylabel('Frequency') #设置x,y轴标题
    
    ax.set_title("Histogram normal u = 100 s = 15") #设置图表标题
    
    ax.hist(x,bins = 100,color = 'r',orientation='horizontal')
    plt.show()

     

    条形图
    bar 
    
    # 第一个参数为条形左下角的x轴坐标,第二个参数为条形的高度;
    # matplotlib会自动设置条形的宽度,本例中条形宽0.8
    plt.bar([1, 2, 3], [3, 2, 5]); 
    plt.show()
    # width参数设置条形宽度;color参数设置条形颜色;bottom参数设置条形底部的垂直坐标
    plt.bar([1, 2, 3], [3, 2, 5], width=0.5, color='r', bottom=1);
    plt.ylim([0, 7])
    plt.show()

     

    # 例子:绘制并列条形图
    
    data1 = 10*np.random.rand(5)
    data2 = 10*np.random.rand(5)
    data3 = 10*np.random.rand(5)
    
    locs = np.arange(1, len(data1)+1)
    width = 0.27
    
    plt.bar(locs, data1, width=width);
    plt.bar(locs+width, data2, width=width, color='red');
    plt.bar(locs+2*width, data3, width=width, color='green') ;
    plt.xticks(locs + width*1, locs);
    plt.show()

     

    barh
    
    plt.barh([1, 2, 3], [3, 2, 5],height = 0.27,color = 'yellow');
    plt.show()

     

    饼图
    【饼图也只有一个参数x!】
    pie()
    饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小
    plt.figure(figsize = (4,4)) # 饼图绘制正方形
    x = [45,35,20] #百分比
    labels = ['Cats','Dogs','Fishes'] #每个区域名称
    plt.pie(x,labels = labels)
    plt.show()

     

    plt.figure(figsize=(4, 4));
    x = [0.1, 0.2, 0.3] 
    # 当各部分之和小于1时,则不计算各部分占总体的比例,饼的大小是数值和1之比 labels = ['Cats', 'Dogs', 'Fishes'] plt.pie(x, labels=labels); # labels参数可以设置各区域标签 plt.show()

     

    # labels参数设置每一块的标签;labeldistance参数设置标签距离圆心的距离(比例值)
    # autopct参数设置比例值的显示格式(%1.1f%%);pctdistance参数设置比例值文字距离圆心的距离
    # explode参数设置每一块顶点距圆形的长度(比例值);colors参数设置每一块的颜色;
    # shadow参数为布尔值,设置是否绘制阴影
    
    plt.figure(figsize=(4, 4));
    x = [4, 9, 21, 55, 30, 18]
    labels = ['Swiss', 'Austria', 'Spain', 'Italy', 'France', 'Benelux']
    explode = [0.2, 0.1, 0, 0, 0.1, 0]
    colors = ['r', 'k', 'b', 'm', 'c', 'g']
    plt.pie(x, 
            labels=labels, 
            labeldistance=1.2,
            explode=explode, 
            colors=colors, 
            autopct='%1.1f%%', 
            pctdistance=0.5, 
            shadow=True);
    plt.show()

     

    散点图
    【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标!】
    scatter()
    # s参数设置散点的大小;c参数设置散点的颜色;marker参数设置散点的形状
    x = np.random.randn(1000)
    y = np.random.randn(1000)
    size = 50*abs(np.random.randn(1000))
    colors = np.random.randint(16777215,size = 1000)
    
    
    li = []
    for color in colors:
        a = hex(color)
        str1 = a[2:]
        l = len(str1)
        for i in range(1,7-l):
            str1 = '0'+str1
        str1 = "#" + str1
        li.append(str1)
    
    plt.scatter(x, y,s = size, c=li, marker='d');
    plt.show()

     

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    import matplotlib.pyplot as plt
    
    x = np.random.randn(1000)
    
    y1 = np.random.randn(1000)
    y2 = 1.2 + np.exp(x) #exp(x) 返回的是e的x次方
    
    ax1 = plt.subplot(121)
    plt.scatter(x,y1,color = 'purple',alpha = 0.3,edgecolors = 'white',label = 'no correl')
    plt.xlabel('no correlation')
    plt.grid(True)
    plt.legend()
    
    
    ax2 = plt.subplot(122)
    plt.scatter(x,y2,color = 'green',alpha = 0.3,edgecolors = 'gray',label = 'correl')
    plt.xlabel('correlation')
    plt.grid(True)
    plt.legend()
    
    plt.show()

     

    图形内的文字、注释、箭头
    文字
    
    x = np.arange(0, 7, .01)
    y = np.sin(x)
    plt.plot(x, y);
    plt.text(0.1, -0.04, 'sin(0)=0'); # 位置参数是坐标
    plt.show()

     

    注释
    
    
    # xy参数设置箭头指示的位置,xytext参数设置注释文字的位置
    # arrowprops参数以字典的形式设置箭头的样式
    # width参数设置箭头长方形部分的宽度,headlength参数设置箭头尖端的长度,
    # headwidth参数设置箭头尖端底部的宽度,shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值)
    
    y = [13, 11, 13, 12, 13, 10, 30, 12, 11, 13, 12, 12, 12, 11, 12]
    plt.plot(y);
    plt.ylim(ymax=35); # 为了让注释不会超出图的范围,需要调整y坐标轴的界限
    plt.annotate('this spot must really
    mean something', xy=(6, 30), xytext=(8, 31.5),
                 arrowprops=dict(width=15, headlength=20, headwidth=20, facecolor='black', shrink=0.1));
    plt.show()

     

    # 生成3个正态分布数据数据集
    x1 = np.random.normal(30, 3, 100)
    x2 = np.random.normal(20, 2, 100)
    x3 = np.random.normal(10, 3, 100)
    
    # 绘制3个数据集,并为每个plot指定一个字符串标签
    plt.plot(x1, label='plot') 
    # 如果不想在图例中显示标签,可以将标签设置为_nolegend_ plt.plot(x2, label='2nd plot') plt.plot(x3, label='last plot') # 绘制图例 plt.legend(bbox_to_anchor=(0, 1.02, 1, 0.102),
    # 指定边界框起始位置为(0, 1.02),并设置宽度为1,高度为0.102 ncol=3, # 设置列数为3,默认值为1 mode="expand", # mode为None或者expand,当为expand时,图例框会扩展至整个坐标轴区域 borderaxespad=0.) # 指定坐标轴和图例边界之间的间距 # 绘制注解 plt.annotate("Important value", # 注解文本的内容 xy=(55,20), # 箭头终点所在位置 xytext=(5, 38), # 注解文本的起始位置,箭头由xytext指向xy坐标位置 arrowprops=dict(arrowstyle='->'));
    # arrowprops字典定义箭头属性,此处用arrowstyle定义箭头风格

     

    箭头

    3D图形
    导包
    
    
    import numpy as np
    import matplotlib.pyplot as plt
    #3d图形必须的
    from mpl_toolkits.mplot3d.axes3d import Axes3D
    %matplotlib inline
    生成数据
    
    
    #系数,由X,Y生成Z
    a = 0.7
    b =  np.pi 
    
    #计算Z轴的值
    def mk_Z(X, Y):
        return 2 + a - 2 * np.cos(X) * np.cos(Y) - a * np.cos(b - 2*X)
    
    #生成X,Y,Z
    x = np.linspace(0, 2*np.pi, 100)
    y = np.linspace(0, 2*np.pi, 100)
    X,Y = np.meshgrid(x, y)
    Z = mk_Z(X, Y)
    绘制图形
    
    fig = plt.figure(figsize=(14,6))
    
    #创建3d的视图,使用属性projection
    ax = fig.add_subplot(1, 2, 1, projection='3d')
    
    ax.plot_surface(X,Y,Z,rstride = 5,cstride = 5)
    
    #创建3d视图,使用colorbar,添加颜色柱
    ax = fig.add_subplot(1, 2, 2, projection='3d')
    p = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap='rainbow', antialiased=True)
    cb = fig.colorbar(p, shrink=0.5)

     

    玫瑰图
    #极坐标条形图
    def showRose(values,title):
        
        max_value = values.max()
        # 分为8个面元
        N = 8
        # 面元的分隔角度
        angle = np.arange(0.,2 * np.pi, 2 * np.pi / N)
        # 每个面元的大小(半径)
        radius = np.array(values)
        # 设置极坐标条形图
        
        plt.axes([0, 0, 2, 2], polar=True,facecolor = 'g')
        
        colors = [(1 - x/max_value, 1 - x/max_value, 0.75) for x in radius]
        # 画图
        
        plt.bar(angle, radius, width=(2*np.pi/N), bottom=0.0, color=colors)
        plt.title(title,x=0.2, fontsize=20)
    绘制图形
    
    #拉韦纳(Ravenna)又译“腊万纳”“拉文纳”“拉温拿”。意大利北部城市。位于距亚得里亚海10公里的沿海平原上
    
    
    data = np.load('Ravenna_wind.npy')
    hist, angle = np.histogram(data,8,[0,360])
    showRose(hist,'Ravenna')

     

    城市气候与海洋关系
    导包
    
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from pandas import Series,DataFrame
    %matplotlib inline
    加载数据
    
    #意大利小镇费拉拉
    ferrara1 = pd.read_csv('./ferrara_150715.csv')
    ferrara2 = pd.read_csv('./ferrara_250715.csv')
    ferrara3 = pd.read_csv('./ferrara_270615.csv')
    ferrara = pd.concat([ferrara1,ferrara2,ferrara3],ignore_index=True) 
    去除没用的列
    
    asti.drop(['Unnamed: 0'],axis = 1,inplace=True)
    
    bologna.drop(['Unnamed: 0'],axis = 1,inplace=True)
    
    cesena.drop(['Unnamed: 0'],axis = 1,inplace=True)
    
    ferrara.drop(['Unnamed: 0'],axis = 1,inplace=True)
    
    mantova.drop(['Unnamed: 0'],axis = 1,inplace=True)
    
    milano.drop(['Unnamed: 0'],axis = 1,inplace=True)
    
    piacenza.drop(['Unnamed: 0'],axis = 1,inplace=True)
    
    ravenna.drop(['Unnamed: 0'],axis = 1,inplace=True)
    
    torino.drop(['Unnamed: 0'],axis = 1,inplace=True)
    获取个城市距离海边距离,最高温度,最低温度,最高湿度,最低湿度
    
    
    dist = [ravenna['dist'][0],
         cesena['dist'][0],
         faenza['dist'][0],
         ferrara['dist'][0],
         bologna['dist'][0],
         mantova['dist'][0],
         piacenza['dist'][0],
         milano['dist'][0],
         asti['dist'][0],
         torino['dist'][0]
    ]
    temp_max = [ravenna['temp'].max(),
         cesena['temp'].max(),
         faenza['temp'].max(),
         ferrara['temp'].max(),
         bologna['temp'].max(),
         mantova['temp'].max(),
         piacenza['temp'].max(),
         milano['temp'].max(),
         asti['temp'].max(),
         torino['temp'].max()
    ]
    temp_min = [ravenna['temp'].min(),
         cesena['temp'].min(),
         faenza['temp'].min(),
         ferrara['temp'].min(),
         bologna['temp'].min(),
         mantova['temp'].min(),
         piacenza['temp'].min(),
         milano['temp'].min(),
         asti['temp'].min(),
         torino['temp'].min()
    ]
    hum_min = [ravenna['humidity'].min(),
         cesena['humidity'].min(),
         faenza['humidity'].min(),
         ferrara['humidity'].min(),
         bologna['humidity'].min(),
         mantova['humidity'].min(),
         piacenza['humidity'].min(),
         milano['humidity'].min(),
         asti['humidity'].min(),
         torino['humidity'].min()
    ]
    hum_max = [ravenna['humidity'].max(),
         cesena['humidity'].max(),
         faenza['humidity'].max(),
         ferrara['humidity'].max(),
         bologna['humidity'].max(),
         mantova['humidity'].max(),
         piacenza['humidity'].max(),
         milano['humidity'].max(),
         asti['humidity'].max(),
         torino['humidity'].max()
    ]
    显示最高温度与离海远近的关系
    
    plt.axis([0,400,32,35])
    plt.plot(dist,temp_max,'ro')

    根据距海远近划分数据
    
    
    观察发现,离海近的可以形成一条直线,离海远的也能形成一条直线。
    首先使用numpy:把列表转换为numpy数组,用于后续计算。
    分别以100公里和50公里为分界点,划分为离海近和离海远的两组数据
    
    # 把列表转换为numpy数组
    x = np.array(dist)
    display('x:',x)
    y = np.array(temp_max)
    display('y:',y)
    
    # 离海近的一组数据
    x1 = x[x<100]
    x1 = x1.reshape((x1.size,1))
    display('x1:',x1)
    y1 = y[x<100]
    display('y1:',y1)
    
    # 离海远的一组数据
    x2 = x[x>50]
    x2 = x2.reshape((x2.size,1))
    display('x2:',x2)
    y2 = y[x>50]
    display('y2:',y2)
    机器学习计算回归模型
    
    
    from sklearn.svm import SVR
    svr_lin1 = SVR(kernel='linear', C=1e3)
    svr_lin2 = SVR(kernel='linear', C=1e3)
    svr_lin1.fit(x1, y1)
    svr_lin2.fit(x2, y2)
    xp1 = np.arange(10,100,10).reshape((9,1))
    xp2 = np.arange(50,400,50).reshape((7,1))
    yp1 = svr_lin1.predict(xp1)
    yp2 = svr_lin2.predict(xp2)
    绘制回归曲线
    
    
    plt.plot(xp1, yp1, c='r', label='Strong sea effect')
    plt.plot(xp2, yp2, c='b', label='Light sea effect')
    #plt.axis('tight')
    plt.legend()
    plt.scatter(x, y, c='k', label='data')

     

     

    最低温度与海洋距离关系
    
    plt.axis((0,400,16,21))
    plt.plot(dist,temp_min,'bo')

     

    最低湿度与海洋距离关系
    
    
    plt.axis([0,400,70,120])
    plt.plot(dist,hum_min,'bo')
    最高湿度与海洋距离关系
    
    plt.axis([0,400,70,120])
    plt.plot(dist,hum_max,'bo')
    平均湿度与海洋距离的关系
    
    hum_mean = [ravenna['humidity'].mean(),
         cesena['humidity'].mean(),
         faenza['humidity'].mean(),
         ferrara['humidity'].mean(),
         bologna['humidity'].mean(),
         mantova['humidity'].mean(),
         piacenza['humidity'].mean(),
         milano['humidity'].mean(),
         asti['humidity'].mean(),
         torino['humidity'].mean()
    ]
    plt.plot(dist,hum_mean,'bo')
    风速与风向的关系
    
    plt.plot(ravenna['wind_deg'],ravenna['wind_speed'],'ro')
    在子图中,同时比较风向与湿度和风力的关系
    
    plt.subplot(211)
    plt.plot(cesena['wind_deg'],cesena['humidity'],'bo')
    plt.subplot(212)
    plt.plot(cesena['wind_deg'],cesena['wind_speed'],'bo')
    玫瑰图
    
    def showRoseWind(values,city_name):
        '''
        查看风向图,半径越大,代表这个方向上的风越多
        '''
        max_value = values.max()
        # 分为8个面元
        N = 8
        # 面元的分隔角度
        theta = np.arange(0.,2 * np.pi, 2 * np.pi / N)
        # 每个面元的大小(半径)
        radii = np.array(values)
        # 设置极坐标条形图
        plt.axes([0.025, 0.025, 0.95, 0.95], polar=True)
        colors = [(1 - x/max_value, 1 - x/max_value, 0.75) for x in radii]
        # 画图
        plt.bar(theta, radii, width=(2*np.pi/N), bottom=0.0, color=colors)
        plt.title(city_name,x=0.2, fontsize=20)
    用numpy创建一个直方图,将360度划分为8个面元,将数据分类到这8个面元中
    
    
    hist, bin = np.histogram(ravenna['wind_deg'],8,[0,360])
    print(hist)
    hist = hist/hist.sum()
    print(bin)
    showRoseWind(hist,'Ravenna')

     

    计算米兰各个方向的风速
    
    print(milano[milano['wind_deg']<45]['wind_speed'].mean())
    print(milano[(milano['wind_deg']>44) & (milano['wind_deg']<90)]['wind_speed'].mean())
    print(milano[(milano['wind_deg']>89) & (milano['wind_deg']<135)]['wind_speed'].mean())
    print(milano[(milano['wind_deg']>134) & (milano['wind_deg']<180)]['wind_speed'].mean())
    print(milano[(milano['wind_deg']>179) & (milano['wind_deg']<225)]['wind_speed'].mean())
    print(milano[(milano['wind_deg']>224) & (milano['wind_deg']<270)]['wind_speed'].mean())
    print(milano[(milano['wind_deg']>269) & (milano['wind_deg']<315)]['wind_speed'].mean())
    print(milano[milano['wind_deg']>314]['wind_speed'].mean())
    将各个方向风速保存到列表中
    
    degs = np.arange(45,361,45)
    tmp =  []
    for deg in degs:
        tmp.append(milano[(milano['wind_deg']>(deg-46)) & (milano['wind_deg']<deg)]['wind_speed'].mean())
    speeds = np.array(tmp)
    print(speeds)
    画出各个方向的风速
    
    N = 8
    theta = np.arange(0.,2 * np.pi, 2 * np.pi / N)
    radii = np.array(speeds)
    plt.axes([0.025, 0.025, 0.95, 0.95], polar=True)
    colors = [(1-x/10.0, 1-x/10.0, 0.75) for x in radii]
    bars = plt.bar(theta, radii, width=(2*np.pi/N), bottom=0.0, color=colors)
    plt.title('Milano',x=0.2, fontsize=20)

     

    抽取函数
    
    def RoseWind_Speed(city):
       degs = np.arange(45,361,45)
       tmp =  []
       for deg in degs:
          tmp.append(city[(city['wind_deg']>(deg-46)) & (city['wind_deg']<deg)]['wind_speed'].mean())
       return np.array(tmp)
    
    
    def showRoseWind_Speed(speeds,city_name):
       N = 8
       theta = np.arange(0.,2 * np.pi, 2 * np.pi / N)
       radii = np.array(speeds)
       plt.axes([0.025, 0.025, 0.95, 0.95], polar=True)
       colors = [(1-x/10.0, 1-x/10.0, 0.75) for x in radii]
       bars = plt.bar(theta, radii, width=(2*np.pi/N), bottom=0.0, color=colors)
       plt.title(city_name,x=0.2, fontsize=20)
    函数调用
    
    showRoseWind_Speed(RoseWind_Speed(ravenna),'Ravenna')

     

     

     

  • 相关阅读:
    JSP课程设计:宿舍管理系统(附源码)
    【博客模板页】从此不再为写博客头疼 (ノ ̄▽ ̄)~(ノ ̄▽ ̄)~(ノ ̄▽ ̄)~
    个人自定义的快捷键
    碎知识点收藏栏 [逆序时间排版]
    JavaSE (46)
    《Java8实战》05
    Python04
    【BUG11】
    三、如何科学地做到:算法竞赛从入门到放弃/算法竞赛从了解入坑到快速放弃指南?
    二、如何科学地在面试时踩雷?
  • 原文地址:https://www.cnblogs.com/hany-postq473111315/p/14231727.html
Copyright © 2011-2022 走看看