zoukankan      html  css  js  c++  java
  • matlplotlib 为折线图填充渐变颜色

    概要

     
    本篇记录绘图时填充颜色时的一些常用设置,主要用到了 imshow,fill 函数。

     


    填充图实例

     
    填充的效果图如下:

    图 1:渐变色效果图

    可根据下方给出的代码进行自定义。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Mon May  6 10:29:22 2019
    
    @author: zk
    """
    
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import datetime
    import matplotlib.dates as mdate
    import numpy as np
    import random
    
    DAYS = 365  
    
    def Init():
        timedelta = datetime.timedelta(days = 1)
        startdate = datetime.date.today()
        
        xdate = [startdate+i*timedelta for i in range(DAYS)]
        
        ycapital = [3000]
        for _ in range(DAYS-1):
            ycapital.append(ycapital[-1]+random.uniform(-1, 1.1))
            
        return xdate, ycapital
    
    xdate, ydata = Init()
    
    xlims = mdate.date2num([xdate[0], xdate[-1]])
    # 设置值,控制显示颜色深浅
    # 第二个参数 yv 是每行值相同,逐行增加,所以设定了水平方向渐变
    _, yv = np.meshgrid(np.linspace(0,1,210), np.linspace(0,1,90))
    
    # Draw the image over the whole plot area
    fig, ax = plt.subplots(figsize=(21,9))
    # 画折线图
    ax.plot(xdate, ydata, 'r-', label = 'My Strategy', linewidth=2)
    # 其中 cmap 参数可以有许多选择,具体看正文介绍
    # zv: array-like or PIL image, 
    # origin:Place the [0,0] index of the array in the upper left or lower left corner of the axes
    # 所以 origin 控制了下方颜色深还是上方颜色深
    #ax.imshow(yv, cmap=mpl.cm.Blues)
    # aspect 设置长宽比例为自适应,默认值为 equal ,坑爹啊。。。
    extent = [xlims[0], xlims[1], min(ydata), max(ydata)]
    ax.imshow(yv, cmap=mpl.cm.Blues, origin='lower',alpha = 0.5, aspect = 'auto',
              extent = extent)
    # Erase 上面 the data by filling with white
    ax.fill_between(xdate, ydata, max(ydata), color='white')
    
    # 设置刻度值颜色
    plt.yticks(color = 'gray')
    # 设置 y 轴百分比显示,注意将 y 轴数据乘以 100
    #ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f%%'))
    # 颜色,旋转刻度
    plt.xticks(color = 'gray',rotation = 15)
    # 指定字体,大小,颜色 
    fontdict = {"family":"Times New Roman", 'size':12, 'color':'gray'} #Times New Roman, Arial
    plt.title("random account value", fontdict = fontdict)
    plt.xlabel("date(day)", fontdict = fontdict)
    plt.ylabel("account value", fontdict = fontdict)
    # 去掉边框 top left right bottom
    ax.spines['top'].set_visible(False) 
    ax.spines['left'].set_visible(False)
    ax.spines['right'].set_visible(False)
    # 设置 x 轴颜色
    ax.spines['bottom'].set_color('lightgray')
    #设置时间标签显示格式
    ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))
    
    #设置时间刻度间隔
    #timedelta = (xdate[-1] - xdate[0]) / 10  # 这种方式不能保证显示最后一个日期
    #plt.xticks(mdate.drange(xdate[0], xdate[-1], timedelta))
    # 分成 10 份
    delta = round(len(xdate) / 9)
    plt.xticks([xdate[i*delta] for i in range(9)] + [xdate[-1]])
    
    #plt.yticks(np.linspace(min(ydata), max(ydata), 5))
    #通过修改tick_spacing的值可以修改x轴的密度
    #ax.xaxis.set_major_locator(ticker.MultipleLocator(10))
    # 去掉 y 轴刻度线,四个方向均可设置
    plt.tick_params(left = 'off')
    # 设置刻度的朝向,宽,长度
    plt.tick_params(which = 'major', direction = 'out', width = 0.2, length = 5) # in, out or inout
    # 设置刻度显示在哪个方向上
    #tick_params(labeltop='on',labelbottom='off',labelleft='off',labelright='off')
    # 设置 y 轴方向的网络线
    plt.grid(axis = 'y', color = 'lightgray', linestyle = '-', linewidth = 0.5)
    
    # 设置图例列宽:columnspacing=float (upper left) 
    plt.legend(loc = 'best', fontsize = 12, frameon=False, ncol = 1)
    #fig.autofmt_xdate()
    plt.show()
    

    至于参数 cmap 的选择可参考下图,该图是官网其中一个颜色效果展示图,更多可访问官网 colormaps_reference

    图 2:渐变色效果图

  • 相关阅读:
    MonoDev 冷门而好用的功能
    Android Runtime
    bat调用bat的一个巨坑
    AssetBundles
    赢家不会告诉你的事
    防止过度工程
    如果你不肯向这个世界投降
    《我的互联网方法论》
    Notepad++ HTML格式化
    Python 包的相对导入讲解
  • 原文地址:https://www.cnblogs.com/zhoukui/p/10979708.html
Copyright © 2011-2022 走看看