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:漸變色效果圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM