zoukankan      html  css  js  c++  java
  • Matplotlib(基于python)


    matplotlib支持的图形地址

    plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas

    用法文档地址

    1.基本要点

    1.导入matplolib

    from matplotlib import pyplot as plt

    2.绘制出折线图

    1. 数据在x轴和y轴的位置,是可迭代对象
    2. 将x,y值传入plt.plot(),绘制出折线图
    3. 只传入一个对象,默认是y,x从0到n-1
    4. 通过plt.show()将绘制的图形展现出来
    from matplotlib import pyplot as plt
    x=range(2,26,2)
    y=[15,13,14.5,17,20,25,26,26,24,22,18,15]
    plt.plot(x,y)
    plt.savefig('./demo1_1.svg')
    plt.show()
    

    demo1_2显示图片

    demo1_1

    3.设置图片大小

    • fig=plt.figure(figsize=(20,8),dpi=80)
      • figure图形图标的意思,这里指绘制的图
      • 实例化figure对象,并传入figsize(大小)和dpi(清晰度)参数,使能够在后台自动使用figure实例
    • plt.savefig('./demo1_2.png')
      • 通过plt.savafig保存图片,svg是矢量图,放大不会有锯齿

    demo1_3显示图片

    demo1_3

    4.调整x,y轴上刻度

    • 设置x的刻度

      • plt.xticks(x)会自动根据每个x的间距对应刻度
      • plt.xticks(x[::3])每次间隔x开始值的3倍来取间隔值
    • 控制坐标轴显示刻度个数

      • plt.locator_params(nbins=)控制x,y坐标轴显示刻度个数,不会多于x的个数
      • plt.locator_params('x',nbins=5)控制x轴刻度显示个数
    • 设置轴的刻度

      • 导入MultipleLocator类,这个类用于设置刻度间隔

        from matplotlib.pyplot import MultipleLocator

      • 实例化两条坐标轴

        axy=plt.gca()

      • 通过坐标轴的xaxis.set_major_locator()方法设置x轴的刻度

        axy.xaxis.set_major_locator(MultipleLocator(1))

    • 设置坐标轴范围

      • plt.axis([-5,5,0,20])分别定义了x轴,y轴的范围
      • plt.xlim([xmin,xmax])plt.ylim([ymin,ymax])分别定义x,轴和y轴的范围

    5.中文显示

    • 使用系统字体全局设置

      • import matplotlib as mpl
      • mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 微软雅黑
      • ``mpl.rcParams['font.serif'] = ['Microsoft YaHei’]`
      • mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
    • 使用下载字体局部设置

      • from matplotlib import font_manager导入字体模块
      • my_font=font_manager.FontProperties(fname='')定义文字所在路径
      • 在需要中文显示的地方添加fontproperties=my_font 设置中文显示,fontsize= 设置字体大小
      from matplotlib import pyplot as plt
      #从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
      from matplotlib.pyplot import MultipleLocator
      import random
      from matplotlib import font_manager
      import matplotlib as mpl
      
      #设置中文显示
      #my_font=font_manager.FontProperties(fname=r'')
      mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 微软雅黑
      mpl.rcParams['font.serif'] = ['Microsoft YaHei']
      mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
      fig=plt.figure(figsize=(20,8),dpi=80)
      x=range(120)
      random.seed(10)#设置随机种子,让不同时候随机得到的结果都一样
      y=[random.uniform(20,35) for i in range(120)]
      plt.plot(x,y)
      
      _x_tick=['10点{}分'.format(i) for i in x if i<60]
      _x_tick+=['11点{}分'.format(i-60) for i in x if i>60]
      plt.xticks(x[::5],_x_tick[::5],rotation=90)
      #为了让字符不被覆盖,使用rotation选项,让字符串旋转90度显示
      #plt.locator_params('x',nbins=3)
      '''ax=plt.gca()
      ax.xaxis.set_major_locator(MultipleLocator(1))
      plt.xlim(0)'''
      
      plt.savefig('./demo1_4.png')
      plt.show()
      

      demo1_5显示图片

      dem01_5

    6.坐标轴及标题显示

    • x轴plt.xlabel('时间’)
    • y轴plt.ylabel('温度’)
    • 标题plt.title('10点到12点分钟的时间变化情况’)

    7.添加文字说明和注释

    • plt.text(x,y,'')添加文字说明
    • plt.annotate('注释', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='black', shrink=0.05), )
      • xy=()被注释的地方
      • xytext=( )插入文本的地方
      • arrowprops=dict()使用箭头小道具

    8.叠加图

    • 在原图上叠加:新的图用plt.plot()
    • 在同一个画布上绘几个子图
      • #设置画布大小像素点 plt.figure(figsize=(14,14),dpi=100)
      • plt.subplot(numbRow , numbCol ,plotNum )
        • numbRow是plot图的行数;numbCol是plot图的列数;plotNum是指第几行第几列的第几幅图

    9.修改坐标轴位置

    • 获得整张坐标图的对象ax=plt.gca()
    • 隐藏坐标轴:
      • spines指包围图表的线条
      • ax.spines[‘right’].set_color(‘none’)隐藏右边线条
      • ax.spines[‘top’].set_color(‘none’)隐藏上边线条
    • 设置那条线为坐标轴
      • ax.xaxis.set_ticks_position(‘bottom’)设置底下线条为x轴
      • ax.yaxis.set_ticks_position(‘left’)设置左边线条为y轴
    • 指定x轴以及y轴的绑定:
      • ax.spines[‘bottom’].set_position((‘data’, 0))设置x轴为x=0的位置
      • ax.spines[‘left’].set_position((‘data’, 0))设置y轴为y=0的位置
      • 两个坐标轴的交点是(0,0)

    2.自定义绘图风格

    在代码执行过程中,有两种方式更改参数:

    • 使用参数字典(matplotlib.rcParams[‘ ‘]=[‘ ‘])
    • 调用matplotlib.rc()命令 通过传入关键字元祖,修改参数

    如果不想每次使用matplotlib时都在代码部分进行配置,可以修改matplotlib的文件参数。可以用matplot.get_config()命令来找到当前用户的配置文件目录。

    配置文件包括以下配置项:

    axex: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
    backend: 设置目标暑促TkAgg和GTKAgg
    figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置
    font: 字体集(font family)、字体大小和样式设置
    grid: 设置网格颜色和线性
    legend: 设置图例和其中的文本的显示
    line: 设置线条(颜色、线型、宽度等)和标记
    patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。
    savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。
    verbose: 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。
    xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。

    线条相关属性标记设置

    1.用来该表线条的属性

    • plt.plot(linestye=' ')线条风格
    • plt.plot(linewidth=5)线条粗细
    线条风格linestyle或ls 描述 线条风格linestyle或ls 描述
    ‘-‘ 实线 ‘:’ 虚线
    ‘–’ 破折线 ‘None’,’ ‘,’’ 什么都不画
    ‘-.’ 点划线

    2.线条标记

    • plt.plot(marker=' ')
    标记marker 描述 标记 描述
    ‘o’ 圆圈 ‘.’
    ‘D’ 菱形 ‘s’ 正方形
    ‘h’ 六边形1 ‘*’ 星号
    ‘H’ 六边形2 ‘d’ 小菱形
    ‘_’ 水平线 ‘v’ 一角朝下的三角形
    ‘8’ 八边形 ‘<’ 一角朝左的三角形
    ‘p’ 五边形 ‘>’ 一角朝右的三角形
    ‘,’ 像素 ‘^’ 一角朝上的三角形
    ‘+’ 加号 竖线
    ‘None’,’’,’ ‘ ‘x’ X

    3.颜色

    • plt.plot(color=' ')
    • 可以通过调用matplotlib.pyplot.colors()得到matplotlib支持的所有颜色。
    别名 颜色 别名 颜色
    b 蓝色 g 绿色
    r 红色 y 黄色
    c 青色 k 黑色
    m 洋红色 w 白色

    如果这两种颜色不够用,还可以通过两种其他方式来定义颜色值:

    • 使用HTML十六进制字符串 color='eeefff' 使用合法的HTML颜色名字(’red’,’chartreuse’等)。
    • 也可以传入一个归一化到[0,1]的RGB元祖。 color=(0.3,0.3,0.4)

    很多方法可以介绍颜色参数,如title()。
    plt.tilte('Title in a custom color',color='#123456')

    4.背景色

    通过向如matplotlib.pyplot.axes()或者matplotlib.pyplot.subplot()这样的方法提供一个axisbg参数,可以指定坐标这的背景色。

    subplot(111,axisbg=(0.1843,0.3098,0.3098)

    5.添加图例

    • plt.plot(lable=' ‘)中用label标签定义图例名
    • plt.legend(prop=,loc='best')指定图例的参数
      • prop指定字体,loc指定图例位置,默认右上角

    3.对比常用统计图

    • 折线图:以折线的上升或下降来表示统计数量的增减变化的统计图

      特点:能够显示数据的变化趋势,反映事物的变化情况。

    • 直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。

      一般用横轴表示数据范围,纵轴表示分布情况。

      特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)

    • 条形图:排列在工作表的列或行中的数据可以绘制到条形图中。

      特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)

    • 散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量

      之间是否存在某种关联或总结坐标点的分布模式。

      特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

    3.1散点图

    • plt.scatter(x,y)
    • 获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),通过散点寻找出气温和随时间(天)变化的某种规律
    from matplotlib import pyplot as plt
    
    import matplotlib as mpl
    
    #设置中文显示
    #my_font=font_manager.FontProperties(fname=r'')
    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 微软雅黑
    mpl.rcParams['font.serif'] = ['Microsoft YaHei']
    mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
    
    #plt.style.use('ggplot')#作出ggplot风格的图片
    
    a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
    b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
    
    _x=range(len(a))
    _y=range(len(a)+10,len(a)+10+len(b))
    
    #绘制散点图
    plt.scatter(_x,a,color='blue',label='3月')
    plt.scatter(_y,b,color='orange',label='10月')
    
    #设置x轴刻度显示
    x=[]
    for i in range(1,32):
        x.append('3月{}日'.format(i))
    for j in range(1,32):
        x.append('10月{}日'.format(j))
    _x_tick=[i for i in _x ]
    _x_tick.extend([j for j in _y])
    plt.xticks(_x_tick[::3],x[::3],rotation=45)
    
    plt.legend(loc='best')
    plt.title('3月和10月的温度变化')
    
    plt.savefig('./demo3_1.png')
    plt.show()
    

    demo3_1显示图片

    demo3_1

    3.2条形图

    • plt.bar(x,y,width=,color='')竖着的条形图
    • plt.barh(x,y,width=,color='’)横着的条形图
    • 将获取到的2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),使用条形图更加直观的展示该数据
    from matplotlib import pyplot as plt
    import matplotlib as mpl
    
    #设置中文显示
    #my_font=font_manager.FontProperties(fname=r'')
    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 微软雅黑
    mpl.rcParams['font.serif'] = ['Microsoft YaHei']
    mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
    
    a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇",
         "变形金刚5:最后的骑士","摔跤吧!爸爸",
         "加勒比海盗5:死无对证","金刚:骷髅岛",
         "极限特工:终极回归","生化危机6:终章",
         "乘风破浪","神偷奶爸3","智取威虎山","大闹天竺",
         "金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传",
         "银河护卫队2","情圣","新木乃伊",]
    b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,
       11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,
       6.86,6.58,6.23]
    
    plt.bar(a,b,width=0.2,color='orange')
    plt.ylabel('电影票房(单位:亿)')
    plt.title('2017年电影票房top20')
    plt.xticks(a,a,rotation=90)#通过设置xticks使数值和字符串对应
    plt.savefig('./demo3_2_1.png')
    plt.show()
    

    demo3_2_1显示图片

    demo3_2_1

    • 知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,使用条形图更加直观的呈现该数据
    from matplotlib import pyplot as plt
    import matplotlib as mpl
    
    #设置中文显示
    #my_font=font_manager.FontProperties(fname=r'')
    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 微软雅黑
    mpl.rcParams['font.serif'] = ['Microsoft YaHei']
    mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
    
    a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
    b_16 = [15746,312,4497,319]
    b_15 = [12357,156,2045,168]
    b_14 = [2358,399,2358,362]
    
    _x=range(len(a))
    plt.bar(_x,b_14,width=0.2,color='blue',label='9月14')
    plt.bar([i+0.2 for i in _x],b_15,width=0.2,color='orange',label='9月15')#紧接9月14显示
    plt.bar([i+0.2*2 for i in _x],b_16,width=0.2,color='green',label='9月16')
    
    plt.legend(loc='best')#图例
    plt.ylabel('票房(单位:亿)')#标签
    plt.title('9月14,15,16三天电影的票房')
    
    #设置坐标轴刻度在9月15号中间
    _x_ticks=[i+0.2 for i in _x]
    plt.xticks(_x_ticks,a)#通过设置xticks使数值和字符串对应
    plt.savefig('./demo3_2_2.png')
    plt.show()
    

    demo3_2_2显示图片

    demo3_2_2

    3.3绘制直方图

    • plt.hist(数据,组数)绘制直方图时数据要是没统计过的,不然应该绘制条形图

    • plt.hist(数据,[min(数据)+i*bin_width for i in range(num_bins)])

      • 可以传入一个列表,长度为组数,值为分组依据,当组距不均匀的时候使用
    • plt.hist(数据,组数,normed=1)normed=bool是否绘制频率直方图,默认绘制

    • plt.grid(True,linestye='-',alpha=0.5)#绘制网格,alpha透明度

    • 获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,通过直方图呈现这些数据

      • 把数据分为多少组进行统计?组数要适当,太少会有较大的统计误差,大多规律不明显

      • 组数:将数据分组,当数组在100个以内时,按数据多少常分5-12组

      • 组距:指每个小组两个端点之间的距离

      • 组距:

        [组数num\_bins=frac{极差}{组距}=frac{max(a)-min(a)}{bin\_width} ]

    from matplotlib import pyplot as plt
    import matplotlib as mpl
    
    #设置中文显示
    #my_font=font_manager.FontProperties(fname=r'')
    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 微软雅黑
    mpl.rcParams['font.serif'] = ['Microsoft YaHei']
    mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
    
    #plt.style.use('ggplot')#作出ggplot风格的图片
    
    a=[131,  98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115,  99, 136, 126, 134,  95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123,  86, 101,  99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140,  83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144,  83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137,  92,121, 112, 146,  97, 137, 105,  98, 117, 112,  81,  97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112,  83,  94, 146, 133, 101,131, 116, 111,  84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
    bin_width=3#组距
    num_bins=int((max(a)-min(a))/bin_width)#组数
    plt.hist(a,num_bins)
    plt.xticks(list(range(min(a),max(a)))[::bin_width],rotation=45)
    
    plt.grid(True,linestyle='-',alpha=0.5)#绘制网格
    plt.xlabel('时长(单位:分钟')
    plt.ylabel('数量')
    plt.title('250部电影的时长分布')
    
    plt.savefig('./demo3_3.png')
    plt.show()
    

    demo3_3显示图片

    demo3_3

    3.4绘制饼图

    • plt.pyplot.pie( )

      • 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, rotatelabels=False, hold=None, data=None)

        1. x :(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;

        2. labels :(每一块)饼图外侧显示的说明文字;

        3. explode :(每一块)离开中心距离;

        4. startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;

        5. shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;

        6. labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内

        7. autopct :控制饼图内百分比设置,可以使用format字符串或者format function
          '%1.1f'指小数点前后位数(没有用空格补齐);

        8. pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;

        9. radius :控制饼图半径,默认值为1;counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={'linewidth':3}设置wedge线宽为3。

        10. textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。

        11. center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。

        12. frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。

        13. rotatelabels :布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。

    from matplotlib import pyplot as plt
    import matplotlib as mpl
    
    #设置中文显示
    #my_font=font_manager.FontProperties(fname=r'')
    mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 微软雅黑
    mpl.rcParams['font.serif'] = ['Microsoft YaHei']
    mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
    
    #plt.style.use('ggplot')#作出ggplot风格的图片
    
    labels = ['娱乐','育儿','饮食','房贷','交通','其它']
    sizes = [2,5,12,70,2,9]#每块比例
    explode = (0,0,0,0.1,0,0)#距离中心点位置
    ##保留1位小数点,增加百分号(%)
    plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
    plt.title("饼图示例-8月份家庭支出")
    
    plt.savefig('./demo3_4.png')
    plt.show()
    

    demo3_4显示图片

    demo3_4

  • 相关阅读:
    【EntityFramework系列教程十,翻译】ASP.NET MVC程序中的一些高级应用
    对不含数据源的DataGridView实现自定义排序
    poj 1584 A Round Peg in a Ground Hole(叉积判断凸多边形)
    大整数运算
    poj 1408 Fishnet(计算几何)
    poj 1201 Intervals(第一道差分约束题)
    poj 2983 Is the Information Reliable?(差分约束)
    poj 2187 Beauty Contest(凸包+旋转卡壳)
    poj 2031 Building a Space Station(prim)
    poj 3007 Organize Your Train part II
  • 原文地址:https://www.cnblogs.com/yffxwyy/p/13941623.html
Copyright © 2011-2022 走看看