Matplotlib 数据处理

Matplotlib (MATLAB_Python) 数据处理

Matplotlib基本要点

可以画的图像(https://matplotlib.org/stable/gallery/index)

使用流程:

  1. 明确问题
  2. 选择图形的呈现方式
  3. 准备数据
  4. 绘图和图形完善
绘制例子(交互):
  1. 百度Echarts
  2. plotly:可视化工具中的github,同时兼容matplotlib和pands https://plot.ly/python/

1. 绘制折线图

  1. 设置图片大小

  2. 保存到本地

  3. 调整间距

    # 使用as可以让调用函数的时候更简单
    from matplotlib import pyplot as plt
    
    """
    figure:指我们画的图(设置图片大小
    dpi: 让图片更加清晰(清晰程度)
    """
    fig = plt.figure(figsize=(20,8), dpi=80)
    
    # 数据在x轴的位置,是一个可迭代对象
    x = range(2, 26, 2)
    # 数据在y轴的位置, 是一个可迭代对象
    y = [15, 13, 14.5, 17, 20, 25, 26, 26, 24, 22, 18, 15]
    # 通过传入x和y,通过plot绘制出折线图
    plt.plot(x, y)
    # 在执行程序的时候展示图形
    
    """
    设置x轴的刻度(y轴是一样的:yticks):y轴range(min(y), max(y)+1)
    可以使用range函数改变步长
    如果有步长为小数,可以使用列表推导式
    可以用列表取步长的操作[start:stop:step]改变步长
    如果不想让他显示x轴刻度,不传就可以了
    """
    _xtick_labels = [i/2 for i in range(2, 49)]
    plt.xticks(_xtick_labels[::3])
    
    """
    保存图片(先生成图片后保存)
    可以保存为.swg这种矢量图格式,放大不会有锯齿
    括号内是保存图片的名称
    """
    plt.savefig("./t1.png")
    plt.show()
    
  4. 描述信息

  5. 线条样式(颜色代码:https://www.codeeeee.com/color/rgb.html

  6. 标记出特殊的点

  7. 添加水印

    import random
    from matplotlib import pyplot as plt
    import matplotlib
    from matplotlib import font_manager
    
    """
    如何设置中文,import matplotlib
    使用matplotlib.rc + (Command + B)去到源码,改font就可以
    option + Command + L 快速调整格式
    """
    # 这种方式Mac无效,Linux和windows可以
    # font = {'family': 'MicroSoft Yahei',
    #         'weight': 'bold',
    #         'size': 'larger'}
    # matplotlib.rc("font", **font)
    # matplotlib.rc("font", family='MicroSoft Yahei', weight='bold', size='larger')
    
    # Mac设置中文的方法, 使用fc-list :lang=zh找到地址
    # from matplotlib import font_manager
    # fname是地址
    my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
    
    x = range(0, 120)
    y = [random.randint(20, 35) for i in range(120)]
    
    fig = plt.figure(figsize=(20, 8), dpi=80)
    
    # 调整x轴的刻度,显示小时:分钟
    _x = list(x)
    _xtick_labels = ["10:{}".format(i) for i in range(60)]
    _xtick_labels += ["11:{}".format(i) for i in range(60)]
    
    # 调整坐标轴刻度的两个参数的步长需要一一对应,格式也要
    # rotation是旋转的度数(逆时针转)
    # 需要解决中文为什么不显示的问题
    plt.xticks(_x[::6], _xtick_labels[::6], rotation=45, fontproperties=my_font)
    
    # 添加描述信息
    plt.xlabel("时间", fontproperties=my_font)
    plt.ylabel("温度", fontproperties=my_font, rotation=90)
    plt.title("10点到12点每分钟的气温变化情况", fontproperties=my_font)
    
    """
    绘制网格
    alpha透明度
    """
    plt.grid(alpha=0.05)
    
    # 添加水印的第一种方式
    plt.text(0.5, 0.5, 'Watermark', fontsize=40, color='gray', alpha=0.5, ha='center', va='center', rotation=30,
             transform=plt.gcf().transFigure)
    
    # 添加水印的第二种方式
    # 需要忽略前面的fig = plt.figure(...)
    # fig, ax = plt.subplots(figsize=(20, 8), dpi=80)
    # ax.plot(x, y)
    # ax.text(0.5, 0.5, 'Watermark', fontsize=40, color='gray', alpha=0.5, ha='center', va='center', rotation=30,
    #         transform=ax.transAxes)
    
    # 设置图像颜色和线条样式
    plt.plot(x, y, label="练习", color="cyan", linestyle="-.")
    
    # 标记特殊点
    # 在特殊点标记红色圆圈
    special_points_x = [2, 4]
    special_points_y = [20, 30]
    plt.scatter(special_points_x, special_points_y, color='red', label='Special Points')
    
    # 添加标签,例子中可能不贴合图像
    for i, txt in enumerate(special_points_y):
        plt.text(special_points_x[i], special_points_y[i], f'({special_points_x[i]}, {txt})')
    
    # 添加图例,只有这里面显示中文是prop,其余都是fontproperties
    plt.legend(prop=my_font, loc="upper left")
    plt.savefig("./t1.png")
    plt.show()
    

    2. 绘制散点图

    重点:plt.scatter(x,y)

    plot变成了scatter

    from matplotlib import pyplot as plt
    from matplotlib import font_manager
    
    my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
    
    y_3 = [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]
    y_10 = [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_3 = range(1, 32)
    x_10 = range(51, 82)
    plt.yticks(range(min(y_3), max(y_3) + 1))
    
    plt.figure(figsize=(20, 8), dpi=80)
    
    # 绘制散点图,将两个图像分开
    # 唯一区别,使用scatter方法绘制散点图
    plt.scatter(x_3, y_3, label="3月份")
    plt.scatter(x_10, y_10, label="10月份")
    
    # 调整x轴的刻度
    _x = list(x_3) + list(x_10)
    _xticks_labels = ["3月{}日".format(i) for i in x_3]
    _xticks_labels += ["10月{}日".format(i-50) for i in x_10]
    plt.xticks(_x[::3], _xticks_labels[::3], fontproperties=my_font, rotation=45)
    
    #添加描述信息
    plt.xlabel("时间", fontproperties=my_font)
    plt.ylabel("温度", fontproperties=my_font)
    plt.title("在3月和10月温度随时间的变化", fontproperties=my_font)
    
    # 添加图例
    plt.legend(prop=my_font, loc="upper left")
    
    # 展示
    plt.show()
    

    3. 绘制条形图

    重点:plt.bar()

    from matplotlib import pyplot as plt
    from matplotlib import font_manager
    
    my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
    
    fig = plt.figure(figsize=(20, 10), dpi=80)
    
    # 数据来源:http://58921.com/alltime/2017
    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(range(len(a)), b, width=0.3)
    # 绘制一个横的条形图
    plt.barh(range(len(a)), b, height=0.3)
    
    plt.grid(alpha=0.3)
    
    plt.yticks(range(len(a)), a,fontproperties=my_font)
    plt.show()
    
    绘制多重条形图
    from matplotlib import pyplot as plt
    from matplotlib import font_manager
    
    my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
    
    fig = plt.figure(figsize=(20, 10), dpi=80)
    # 数据来源:http://www.cbooo.cn/movieday
    a = ["猩球崛起3:终极之战", "敦刻尔克", "蜘蛛侠:英雄归来", "战狼2"]
    b_14 = [2358, 399, 2358, 362]
    b_15 = [12357, 156, 2045, 168]
    b_16 = [15746, 312, 4497, 319]
    
    bar_width = 0.2
    
    x_14 = list(range(len(a)))
    x_15 = [i + 0.2 for i in x_14]
    x_16 = [i + 0.2 * 2 for i in x_14]
    
    plt.bar(range(len(a)), b_14, width=bar_width, label="9月14日")
    plt.bar(x_15, b_15, width=bar_width, label="9月15日")
    plt.bar(x_16, b_16, width=bar_width, label="9月16日")
    plt.xticks(x_15, a, fontproperties=my_font)
    
    plt.legend(loc="upper right",prop=my_font)
    
    plt.show()
    

    4. 绘制直方图

    组数 = 极差 组距 = m a x ( a ) − m i n ( a ) b i n w i d t h 组数=\frac{极差}{组距}=\frac{max(a)-min(a)}{bin_{width}} 组数=组距极差=binwidthmax(a)min(a)

    重点:plt.hist()

    #需要使用原有数据,不能使用统计数据(条形图),才能绘制直方图
    from matplotlib import pyplot as plt
    from matplotlib import font_manager
    
    my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
    
    fig = plt.figure(figsize=(20, 8), dpi=80)
    
    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, 110, 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, 127, 119, 105, 137, 123,
         128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 116, 108, 132, 103, 136, 128, 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, 130, 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, 140, 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]
    
    # 组距要选择最大值-最小值能被整除的
    # print((max(a) - min(a)))
    
    # 计算组数
    bin_width = 3
    num_bins = int((max(a) - min(a)) / bin_width)
    # density=bool,是否绘制频率分布直方图,默认为频数直方图
    plt.hist(a, num_bins, density=True)
    
    # 设置x轴刻度
    plt.xticks(range(min(a), max(a) + bin_width, bin_width))
    plt.grid(alpha=0.6)
    plt.show()
    

    经过统计的数据绘制条形图:

    from matplotlib import pyplot as plt
    from matplotlib import font_manager
    
    my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
    
    # 时间间隔
    interval = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 90]
    width = [5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 30, 60]
    quantity = [836, 2737, 3723, 3926, 2596, 1438, 3273, 642, 924, 613, 215, 47]
    
    fig = plt.figure(figsize=(20, 8), dpi=80)
    
    plt.bar(range(len(quantity)), quantity, width=1)
    # 设置x轴的刻度,左加右减
    # i-0.5 将刻度标签的位置从条形的中心向左偏移半个单位,以便刻度标签居中对齐在两个条形之间
    _x = [i - 0.5 for i in range(len(quantity) + 1)]
    print(_x)
    _xticks_label = interval + [150]
    plt.xticks(_x, _xticks_label)
    plt.grid(alpha=0.4)
    plt.show()
    

代码课程来源:

【【python教程】数据分析——numpy、pandas、matplotlib】
https://www.bilibili.com/video/BV1hx411d7jb?p=13&vd_source=60fe04a9d6b8a78937ea6e0fb8eb7b0b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值