zoukankan      html  css  js  c++  java
  • Python数据分析-Matplotlib图标绘制

    Matplotlib介绍

      Matplotlib是一个强大的Python绘图和数据可视化的工具包。 

    Matplotlib的主要功能

      Matplotlib是python中的一个包,主要用于绘制2D图形(当然也可以绘制3D,但是需要额外安装支持的工具包)

    Matplotliban安装、调用

       安装:pip install matplotlib

      调用:import matplotlib.pyplot as plt

    Plot函数绘制多条曲线

    一维参数

    例如传入一个list对象使用plot,打印输出形成的图像

    a=[1,2,3]
    plt.plot(a)  #只有一个参数时,值代表y轴的值,x为值对应的索引
    plt.show()

    结果:plot画出的图中横坐标是list的index,纵坐标是list的value,他会在图上形成三个点,然后将点连成线,所以它形成的是折线图,因为list满足线性关系(y的值是连续的),所以形成的图像是一个直线

    二维参数

    例如传入2个list对象使用plot,打印输出形成的图像

    a=[1,2,3]
    b=[4,5,6]
    plt.plot(a,b)
    plt.show()

    结果:

     折线图会根据传入参数的变化,线形状会发生变化

    注意:传入的2个参数数值位数必须一致,否则会出现ValueError报错

    设定线条风格(点线、虚线、圆点、颜色设置

    线型linestyle(-,-.,--,.点型marker(v,^,s,*,H,+,x,D,o,…颜色color(b,g,r,y,k,w,…

    1.默认是实现,可以设置成点线和虚线

    2.默认是蓝色,可以设置成其他颜色

     虚线 ' -- ' ,参数指定了线的类型为虚线

    a=[1,2,3]
    b=[4,5,8]
    plt.plot(a,b,'--')
    plt.show()

    点线 ‘ * ’,参数制定了线的类型为点线(plt.plot(a,b,'o'), o 表示圆点

    a=[1,2,3]
    b=[4,5,8]
    plt.plot(a,b,'*') 
    plt.show()

    颜色 

    例如设定红色线条

    a=[1,2,3]
    b=[4,5,8]
    plt.plot(a,b,'r') #plt.plot(a,b,'red') 也可以直接写颜色的英文单词
    plt.show()

    形状+颜色联合设定,例如设定绿色+虚线线条

    a=[1,2,3]
    b=[4,5,8]
    plt.plot(a,b,'g--') #绿色并且虚线
    plt.show()

    绘制多条曲线

    #plot函数绘制多条曲线
    标题:set title
    x轴: set xlabel
    y轴: set ylabel

    只需要依次指定每组(两两)线条的x、y坐标即可

    #一个图像中绘制多个线条
    a=[1,2,3]
    b=[4,5,8]
    c=[7,8,6]
    d=[1,5,2]
    plt.plot(a,b,c,d,'r--')
    plt.show()

    可以给不同线条指定不同的风格

    a=[1,2,3]
    b=[4,5,8]
    c=[7,8,6]
    d=[1,5,2]
    plt.plot(a,b,'bo',c,d,'r+')
    plt.show()

     多曲线基础操作演示

    1)首先生成数据,绘制2条线

    #一个窗口下绘制两条线,并对其添加显示内容
    t=np.arange(0,2,0.1)
    print(t)
    print(t.size) #20
    
    #np.sin()取传入的参数的正弦
    #np.pi 是一个常量,代表3.1415926...
    s=np.sin(t*np.pi)
    print(s)
    print(s.size) #20
    '''
    [ 0.00000000e+00  3.09016994e-01  5.87785252e-01  8.09016994e-01
      9.51056516e-01  1.00000000e+00  9.51056516e-01  8.09016994e-01
      5.87785252e-01  3.09016994e-01  1.22464680e-16 -3.09016994e-01
     -5.87785252e-01 -8.09016994e-01 -9.51056516e-01 -1.00000000e+00
     -9.51056516e-01 -8.09016994e-01 -5.87785252e-01 -3.09016994e-01]
    
    '''
    plt.plot(t,s,'r--',t*2,s,'g--')
    plt.show()

    显示结果

    2)为x、y轴坐标设置标签label说明

    plt.plot(t,s,'r--',t*2,s,'g--')
    plt.xlabel('x轴')
    plt.ylabel('y轴')
    plt.show()

     结果:存在两个问题    1):中文无法识别   2):坐标负号显示可能会有问题

    做数据分析时,可以提前再开头写入这2行,避免中文、负号识别问题:

    解决问题1:中文内容无法识别问题,在建立图标之前加入一行代码

    #解决中文标签不显示问题plt.rcParams['font.sans-serif'] = ['SimHei']

    解决问题2:坐标轴上负号无法显示的问题

    #负号显示问题
    plt.rcParams['axes.unicode_minus'] = False

    3)为图像指定title标题说明

    plt.title('元素正弦图示')

    4)为图像指定图例label(即每条线设置描述说明)

    #分别为2条线侧面添加描述说明
    plt.plot(t,s,'r--',label='线条一走向')
    plt.plot(t*2,s,'g--',label='线条二走向')
    
    plt.xlabel('x轴')
    plt.ylabel('y轴')
    plt.title('元素正弦图示')
    
    #一定要加结束语
    plt.legend()
    
    plt.show()

    最终显示结果

     

    曲线图操作展示初级

    (1)numpy+matplotlib结合,根据提供的值得出x、y轴的显示图

    import matplotlib.pyplot as plt
    
    import numpy as np
    import pandas as pd
    
    #实例1
    
    #从[-1,1]中取50个等差值
    x=np.linspace(-1,1,50)
    #print(x)
    
    y=2*x +1
    
    #x:横坐标的值 y:纵坐标的值
    res1=plt.plot(x,y)
    print(res1)  #[<matplotlib.lines.Line2D object at 0x0ACE2350>] 返回的是一个matplotlib.lines.Line2D对象
    
    #将设置好的figure(图形、形状)显示出来
    plt.show()

    结果为

    延伸:变化如果y=2^x,再次求最终的图像显示

    x=np.linspace(-1,1,50)
    #y=2^x平方,因为不是同比增长,生成的图像如下
    y=2**x +1
    plt.plot(x,y)
    plt.show()

     结果为

    hist函数绘制频数直方图

    实验一:

    第一步:生成一个100*100初始值为0的二维数组

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import random
    第一步:生成一个100*100初始值为0的二维数组
    data=np.zeros((100,100),dtype=int)

    第二步:利用random模块将数组中每个值变为0-20的随机值

    第二步:利用random模块将数组中每个值变为0-20的随机值
    for i in range(len(data)):
        #拿到每一行数组的长度
        for j in range(len(data[0])):
    
            #根据以上2个参数可以一次循环取出数组中的没一个参数,并通过下面操作给每个参数随机赋值
            data[i][j] = random.randint(1,20)
    
    print('初始Numpy,data数组的变化')
    print(type(data))  #<class 'numpy.ndarray'>

    第三步:将Numpy数组类型转为DataFrame类型(即让数组有横竖的坐标)

    第三步:将Numpy数组类型转为DataFrame类型(即让数组有横竖的坐标)
    data_new=pd.DataFrame(data)
    print(data_new)
    
    '''
    DataFrame变化后的改变
     0   1   2   3   4   5   6   7   8  ...  91  92  93  94  95  96  97  98  99
    0   12   5  13   3  19   4   1   4  10 ...  14   2  14  10   4  10  13  15  15
    1   12  18  16  20   6   7   1  14  18 ...   4  15  19   8  20  16  15   8  12
    2   15   9   1   3  18  12  20  20   9 ...  20   2   1   9  17   9  17   2   2
    3   10  15   8   2   3  16  13  13  19 ...  10  14  15  17   4   7   2  11   9
    4    1   3   6  10  11  14   3  10  13 ...   8  19   1  12   2  10  20   6   5
    5   20  19  11   8   1  19   1   2   6 ...   1  16  18   7  17  15  20  15   2
    6    7  14  18   2  14  18   2  14  15 ...  14  11  16  14  12  17   8  10   4
    7   20  12  17   5  11  10  10   8  14 ...   7  20   1   5  10  15  18  13  10
    8   17  16  14   5   7  11   5  16   8 ...  18   8   4   7   7   3  17  10  20
    9    6   7  16  13   7  15  13  15   5 ...   7   5   9   8   7   1  14  15  17
    10   1  10   9   5   5  11  16  20  10 ...  17  18  18   7  16   3  11   7  13
    11   3  10  15  17   9  16  19  13   1 ...   5   5  18   1   7  16  15  13   4
    12  13  10  18  17  16  10  12  16   7 ...  12   2   7  16  12  19   7  11  12
    13   4  10  20   1   1   1  19   6  17 ...  16   5  19  12  16  14  18  14  13
    14   9  13  18   6  10   8   9   4   1 ...   9  12   6   8  10   1  10   9  18
    15   6  11   4   5  17   1  10   2  12 ...  20   1  17   8   7   9  17  19  14
    16   9   2  17   4  17  16   8  16   3 ...  10  11   5  16   1   2   7  18  16
    17  16   3   2  16  15  17   8   8  13 ...  17   4  11  14   9  12  12   5  14
    18   9   3  18   1   7  20   1  18  14 ...   1   5   2  12   9  10   6   4  12
    19  19  18   3  13  18  17   7  12   5 ...  15   2   3  19   8   5   3   7  14
    20  20  15   5  14   1  19  10   7  16 ...  12  14  12  12  18  15  17   4   6
    21  10  20  19   6   6  20  18  20   5 ...  19   6  20   9   4  15  16  20   5
    22  14  12   2   3   4  14   6   2  16 ...  16  10   5  20   3  14  20   6  19
    23  14  18   6  12   3  11  10   8   8 ...   9   2   7  13  13  14   3  13   1
    24   2  16   3  20   4  15  15   2   9 ...  20   7  16  13   3   1  18   5  17
    25   9  17   8  15   5  16   1  19   3 ...  17   8   7   4   2  13   4  13  14
    26  16  12   7  19  13   1  19  16   7 ...  15  11   3  19  19   4   2   1   6
    27   8  14   2   6   7  16  11  19  19 ...  10   7   9  12  18  17  14  12   9
    28   6  14  12  13  18  20  10   9  12 ...  15   2  20  14  11   6  16  19   3
    29  18   3  13  15  20   5  10  18  17 ...   5  17  11  20  10  15   3  12   9
    ..  ..  ..  ..  ..  ..  ..  ..  ..  .. ...  ..  ..  ..  ..  ..  ..  ..  ..  ..
    70   5   9  20   9  20   4   3  12  17 ...  10   6  17  14   1   9   6  10  10
    71  11  10  17  14  19   2   4  19   5 ...   8   4   7   1  20  13   7  11  15
    72  13  11  16  15   3   8   4  17  13 ...   6   8  20   3  12   8  14  20   7
    73   2  19   6   1  12   2  14  10  14 ...  10  17   9   1  18   1   6  14   7
    74   3   8  17   1  12   4  17  18   7 ...  16  10  15   6  16   3   5   8  17
    75   1  15   4   9  20   5  16   9  20 ...  18  13  10   6  19   9  20  12  16
    76  16   6   6  19   4   5   8   1  11 ...  17  17  20   6  14   1   4   5   1
    77  15   4  16  19   8   4  11  10  12 ...   1   6  19  13  12  16  10   3  13
    78  18  16  20  13  16  15  18  11   4 ...   4  12   5  17  16  18  15  17  10
    79  20   1  18   6   3   7  19   6  10 ...  14  16  12   8  15   9   5   6   6
    80  15  14   4   1  14   8  10  18  14 ...  13  10  18  16   5   8  11   7   4
    81   3  19   1   8  13   8  20  19   8 ...   7  19   9   9   9   6  10  19  20
    82   9  18  19   1   3   1  13   6   3 ...   8  14   7   5  14   3   7   5  11
    83  15   5  14  13  18   3   1   5  10 ...  12   7  14   5   1  11   7   6   3
    84  12  18  16  10  19   6   9   3   8 ...  19   7   1   7   9  12   6  20  13
    85  16  16   2  17   3   3   8  15   2 ...   1  20  15   1  17  19  16   4   4
    86   2  12  11   7   5  14  19  19  18 ...   3   4  16   2   8   6  13  18  11
    87  10  13  19  20   6  17   3  20   7 ...  16   2   8  20  19  14  17   6   7
    88   6   3   7  12  13  19   1  17  14 ...  14  10  18  12  14  14   4  12   8
    89  16   8  19  12  14  15   2  11  19 ...   2  18  20   6  18   9  20  10   2
    90  12  17  19  19  17  18  18  14   6 ...   7  13  16   5   3  16  10   4  11
    91  16   1  13  13   4  12  18  12   4 ...  11  19   5   6  18  18   9  17  17
    92   3   8  10   1  13   1  15  19  19 ...  20  18  15   5  14  12  13  16   8
    93  11   9  12  10   4   2  14   6  16 ...   6  11  11   9  11   7   8  17  14
    94  13   3   6   3  16   3   3  11  10 ...   8   6  17  17  14   9   7   4   5
    95   2   3   9  17   1  14  17   3  18 ...   3   4  12   6   7  14  12  14   8
    96   3  18   8   5  11  10  11  11  19 ...   2  13  15  14  18   9  11  13  19
    97   2   3   5  15   5   7  13   4  16 ...  12   2  16   5   1  10  10   2  13
    98   3   9   6   4   2  13   5  20  12 ...   6  20  14   7   6   4  10  12  14
    99  20  16   3  12  14  11  14   7  10 ...   9   3  11  17   5   3   9   1  15
    
    
    '''
    print(type(data_new))  #<class 'pandas.core.frame.DataFrame'>

    第四步:从DataFrame数组中取第1列的值

    #拿到第一列的值
    print('取第一列的值')
    print(data_new[0])
    
    '''
    取第一列的值
    0     12
    1     12
    2     15
    3     10
    4      1
    5     20
    6      7
    7     20
    8     17
    9      6
    10     1
    11     3
    12    13
    13     4
    14     9
    15     6
    16     9
    17    16
    18     9
    19    19
    20    20
    21    10
    22    14
    23    14
    24     2
    25     9
    26    16
    27     8
    28     6
    29    18
          ..
    70     5
    71    11
    72    13
    73     2
    74     3
    75     1
    76    16
    77    15
    78    18
    79    20
    80    15
    81     3
    82     9
    83    15
    84    12
    85    16
    86     2
    87    10
    88     6
    89    16
    90    12
    91    16
    92     3
    93    11
    94    13
    95     2
    96     3
    97     2
    98     3
    99    20
    Name: 0, Length: 100, dtype: int32
    
    '''

    第五步:通过value_counts()对第四步数据进行处理,得出数值与频数的对应关系表,如下

    #注意value_counts函数统计一个series上的数据情况
    data_new=data_new[0].value_counts()
    data_new=data_new.sort_index()
    print('绘制DataFrame数组第一列中数值与频率的对应关系柱状图')
    print(data_new)
    
    '''
    (数值) (频数)
    1      5
    2      7
    3     12
    4      4
    5      2
    6      6
    7      1
    8      4
    9      5
    10     5
    11     3
    12     4
    13     5
    14     4
    15     6
    16     7
    17     3
    18     3
    19     6
    20     8
    Name: 0, dtype: int64
    
    '''

    第六步:利用plt.hist()绘制柱状图

    通过DataFrame绘制第一列,数据——频率柱状图

    #通过DataFrame绘制第一列,数据——频率柱状图
    print('根据上面的data_new,绘制第一列数据与频率的柱状图')
    plt.hist(data_new,bins=20)   #bins指柱状图的柱数默认是10
    plt.show()

    通过DataFrame绘制第一列,数据——频率柱状图

    #通过Numpy绘制每一行,数据——频率柱状图(横轴:数据 纵轴:频数)
    print('绘制Numpy,data[0]第一行数据与频率的柱状图')
    plt.hist(data[0])
    plt.show()

  • 相关阅读:
    10个有用的网站访问分析工具
    在 IIS6 ASP.NET 4.0 安装 最常遇到的四个问题
    [转]qUIpt:JavaScript Cache Library
    Windows Phone 7 Jump Start
    TFS GrantBackup Plan Permissions Error
    JQuery 专题
    IEnumberable<String> To String
    Charts Controls 开发系列2
    Script#
    SQL SERVER 经验、资料收录
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/10077410.html
Copyright © 2011-2022 走看看