美文网首页
matplotlib 画统计图大全

matplotlib 画统计图大全

作者: 一百万个不确定 | 来源:发表于2019-03-26 00:02 被阅读0次

    matplotlib 画统计图大全

    1. 柱状图
    • 适用场景:适用场合是二维数据集(每个数据点包括两个值x和y),但只有一个维度需要比较,用于显示一段时间内的数据变化或显示各项之间的比较情况。适用于枚举的数据,比如地域之间的关系,数据没有必然的连续性。

    • 优势:柱状图利用柱子的高度,反映数据的差异,肉眼对高度差异很敏感。

    • 劣势:柱状图的局限在于只适用中小规模的数据集。

      from matplotlib.ticker import FuncFormatter
      import matplotlib.pyplot as plt
      import numpy as np
      
      x = np.arange(4)
      money = [1.5e5, 2.5e6, 5.5e6, 2.0e7]
      
      
      def millions(x, pos):
          'The two args are the value and tick position'
          return '$%1.1fM' % (x * 1e-6)
      
      
      formatter = FuncFormatter(millions)
      
      fig, ax = plt.subplots()
      ax.yaxis.set_major_formatter(formatter)
      plt.bar(x, money)
      plt.xticks(x, ('Bill', 'Fred', 'Mary', 'Sue'))
      plt.show()
      
      1.png
    1. 堆积柱状图
    • 不仅可以直观的看出每个系列的值,还能够反映出系列的总和,尤其是当需要看某一单位的综合以及各系列值的比重时,最适合。

      import numpy as np
      import matplotlib.pyplot as plt
      
      
      N = 5
      menMeans = (20, 35, 30, 35, 27)
      womenMeans = (25, 32, 34, 20, 25)
      menStd = (2, 3, 4, 1, 2)
      womenStd = (3, 5, 2, 3, 3)
      ind = np.arange(N)    # the x locations for the groups
      width = 0.35       # the width of the bars: can also be len(x) sequence
      
      p1 = plt.bar(ind, menMeans, width, yerr=menStd)
      p2 = plt.bar(ind, womenMeans, width,
                   bottom=menMeans, yerr=womenStd)
      
      plt.ylabel('Scores')
      plt.title('Scores by group and gender')
      plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
      plt.yticks(np.arange(0, 81, 10))
      plt.legend((p1[0], p2[0]), ('Men', 'Women'))
      
      plt.show()
      
      2.png
    1. 条形图(横向柱状图)
    • 适用场景:显示各个项目之间的比较情况,和柱状图类似的作用。
    • 优势:每个条都清晰表示数据,直观。
    """
    Simple demo of a horizontal bar chart.
    """
    import matplotlib.pyplot as plt
    plt.rcdefaults()
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Example data
    people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')
    y_pos = np.arange(len(people))
    performance = 3 + 10 * np.random.rand(len(people))
    error = np.random.rand(len(people))
    
    plt.barh(y_pos, performance, xerr=error, align='center', alpha=0.4)
    plt.yticks(y_pos, people)
    plt.xlabel('Performance')
    plt.title('How fast do you want to go today?')
    plt.show()
    
    
    3.png
    1. 折线图
    • 适用场景: 折线图适合二维的大数据集,还适合多个二维数据集的比较。一般用来表示趋势的变化,横轴一般为日期字段。
    • 优势:容易反应出数据变化的趋势。
    import sys
    
    import matplotlib.pyplot as plt
    import tushare as ts
    
    
    # 获取上证50指数的历史数据
    data = ts.get_hist_data('sz50',start='2018-11-01',end='2019-03-25')
    
    data = data.sort_index()
    
    # 一个基本的折线图
    x = range(len(data))
    # 收盘价的折线图
    plt.plot(x,data['close'])
    plt.show()
    
    4.png
    1. 数据地图
    • 适用场景:适用于有空间位置的数据集,一般分成行政地图(气泡图、面积图)和GIS地图。行政地图一般有省份、城市数据就够了(比如福建-泉州);而GIS地图则需要经纬度数据,更细化到具体区域,只要有数据,可做区域、全国甚至全球的地图。
    • 优劣势:特殊状况下使用,涉及行政区域。
    import requests
    from csv import DictReader
    DATA_URL = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_month.csv'
    print("Downloading", DATA_URL)
    resp = requests.get(DATA_URL)
    quakes = list(DictReader(resp.text.splitlines()))
    # ...avoiding numpy/pandas Array() for now, and can't care enough to do this less awkwardly...
    lngs = [float(q['longitude']) for q in quakes]
    lats = [float(q['latitude']) for q in quakes]
    mags = [2 ** float(q['mag']) for q in quakes]
    
    # %matplotlib  # in iPython
    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
    plt.figure(figsize=(14, 8))
    earth = Basemap()
    earth.bluemarble(alpha=0.42)
    earth.drawcoastlines(color='#555566', linewidth=1)
    plt.scatter(lngs, lats, mags, 
                c='red',alpha=0.5, zorder=10)
    plt.xlabel("M4.5 earthquakes in the past 30 days from March 18, 2016 (USGS)")
    plt.savefig('usgs-4.5quakes-bluemarble.png', dpi=350)
    
    plt.savefig('usgs-4.5quakes.svg')
    
    fig, ax = plt.subplots()
    earth = Basemap(ax=ax)
    earth.drawcoastlines(color='#555566', linewidth=1)
    ax.scatter(lngs, lats, mags, c='red',alpha=0.5, zorder=10)
    ax.set_xlabel("Hello there")
    fig.savefig('hello-ax.png')
    
    import pandas as pd
    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
    
    
    DATA_URL = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_month.csv'
    print("Downloading", DATA_URL)
    df = pd.read_csv(DATA_URL)
    
    fig, ax = plt.subplots()
    earth = Basemap(ax=ax)
    earth.drawcoastlines(color='#556655', linewidth=0.5)
    ax.scatter(df['longitude'], df['latitude'], df['mag'] ** 2, 
               c='red', alpha=0.5, zorder=10)
    ax.set_xlabel("This month's 4.5M+ earthquakes")
    fig.savefig('usgs-monthly-4.5M.png')
    
    real5.png
    1. 饼图(环图)
    • 适用场景:显示各项的大小与各项总和的比例。适用简单的占比比例图,在不要求数据精细的情况适用。
    • 优势:明确显示数据的比例情况,尤其合适渠道来源等场景。
    • 劣势:不会具体的数值,只是整体的占比情况。
    import matplotlib.pyplot as plt
    
    # Pie chart, where the slices will be ordered and plotted counter-clockwise:
    labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
    sizes = [15, 30, 45, 10]
    explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs')
    
    fig1, ax1 = plt.subplots()
    ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
            shadow=True, startangle=90)
    ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
    
    plt.savefig('Demo_official.jpg')
    plt.show()
    
    5.png
    1. 雷达图
    • 适用场景:雷达图适用于多维数据(四维以上),一般是用来表示某个数据字段的综合情况,数据点一般6个左右,太多的话辨别起来有困难。

    • 优势:主要用来了解公司各项数据指标的变动情形及其好坏趋向。

    • 劣势:理解成本较高。

      # 导入第三方模块
      import numpy as np
      import matplotlib.pyplot as plt
      
      # 中文和负号的正常显示
      plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
      plt.rcParams['axes.unicode_minus'] = False
      
      # 使用ggplot的绘图风格
      plt.style.use('ggplot')
      
      # 构造数据
      values = [3.2,2.1,3.5,2.8,3]
      feature = ['personal ability','quality control','solve','serve','team']
      
      N = len(values)
      # 设置雷达图的角度,用于平分切开一个圆面
      angles=np.linspace(0, 2*np.pi, N, endpoint=False)
      
      # 为了使雷达图一圈封闭起来,需要下面的步骤
      values=np.concatenate((values,[values[0]]))
      angles=np.concatenate((angles,[angles[0]]))
      
      # 绘图
      fig=plt.figure()
      # 这里一定要设置为极坐标格式
      ax = fig.add_subplot(111, polar=True)
      # 绘制折线图
      ax.plot(angles, values, 'o-', linewidth=2)
      # 填充颜色
      ax.fill(angles, values, alpha=0.25)
      # 添加每个特征的标签
      ax.set_thetagrids(angles * 180/np.pi, feature)
      # 设置雷达图的范围
      ax.set_ylim(0,5)
      # 添加标题
      plt.title('behave')
      # 添加网格线
      ax.grid(True)
      # 显示图形
      plt.show()
      
      6.png
    1. 漏斗图
    • 适用场景:漏斗图适用于业务流程多的流程分析,显示各流程的转化率
    • 优势:在网站分析中,通常用于转化率比较,它不仅能展示用户从进入网站到实现购买的最终转化率,还可以展示每个步骤的转化率,能够直观地发现和说明问题所在。
    • 劣势:单一漏斗图无法评价网站某个关键流程中各步骤转化率的好坏。
    %matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.patches import Circle
    from matplotlib.offsetbox import (TextArea, DrawingArea, OffsetImage,
                                      AnnotationBbox)
    from matplotlib.cbook import get_sample_data
    
    #中文及负号处理
    plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    N = 5
    width = 0.55
    x1 = np.array([1000, 500, 300, 200,150])
    x2= np.array((x1.max()-x1)/2) # 占位
    #x1+x2
    x3=[]
    for i,j in zip(x1,x2):
        x3.append(i+j)
    x3 = np.array(x3)
    
    
    y = -np.sort(-np.arange(N)) # 倒转y轴
    labels=['浏览商品','放入购物车','生成订单','支付订单','完成交易']
    
    #figure
    fig = plt.figure(figsize=(12,8))
    ax = fig.add_subplot(111)
    
    #plot
    ax.barh(y,x3,width,tick_label=labels,color='r',alpha=0.85)
    ax.plot(x3,y,'red',alpha=0.7)
    ax.barh(y,x2,width,color='w',alpha =1) #辅助图
    ax.plot(x2,y,'red',alpha=0.7)
    
    #setting
    transform = []       
    for i in range(0,len(x1)):
        if i < len(x1)-1:
            transform.append('%.2f%%'%((x1[i+1]/x1[i])*100))
    l = [(500,3),(500,2),(500, 1),(500, 0)]
    for a,b in zip(transform,l):
        offsetbox = TextArea(a, minimumdescent=False)
        ab = AnnotationBbox(offsetbox, b,
                            xybox=(0, 40),
                            boxcoords="offset points",
                            arrowprops=dict(arrowstyle="->"))
        ax.add_artist(ab)
    ax.set_xticks([0,1000])
    ax.set_yticks(y)
    
    plt.show()
    
    7.png
    1. 散点图
    • 适用场景:显示若干数据系列中各数值之间的关系,类似XY轴,判断两变量之间是否存在某种关联。散点图适用于三维数据集,但其中只有两维数据是需要比较的。另外,散点图还可以看出极值的分布情况。

    • 优势:对于处理值的分布和数据点的分簇区域(通过设置横纵项的辅助线),散点图都很理想。如果数据集中包含非常多的点,那么散点图便是最佳图表类型。

    • 劣势:在点状图中显示多个序列看上去非常混乱。

      import matplotlib.pyplot as plt
      import numpy as np
      
      # Fixing random state for reproducibility
      np.random.seed(19680801)
      
      
      x = np.arange(0.0, 50.0, 2.0)
      y = x ** 1.3 + np.random.rand(*x.shape) * 30.0
      s = np.random.rand(*x.shape) * 800 + 500
      
      plt.scatter(x, y, s, c="g", alpha=0.5, marker=r'$\clubsuit$',
                  label="Luck")
      plt.xlabel("Leprechauns")
      plt.ylabel("Gold")
      plt.legend(loc='upper left')
      plt.show()
      
    8.png

    相关文章

      网友评论

          本文标题:matplotlib 画统计图大全

          本文链接:https://www.haomeiwen.com/subject/akxwvqtx.html