需求
上面是客戶給的樣圖先舷,從上面的樣圖中我們可以總結出如下需求:
- 繪圖樣式包含散點圖和折線圖;
- 繪圖包含虛線網格甫窟;
- 繪圖包含圖例密浑,且字體樣式是斜體;
- 有一個垂直顏色帶粗井;
- 下方的刻度線標簽替換成日期尔破;
實現
第一步,使用 pandas 讀取數據浇衬,讀取完畢之后直接調用 plot
方法進行繪圖懒构,對數據進行初步探查;
相比于樣圖耘擂,我們缺少了圖例胆剧、網格、顏色帶和散點圖(客戶說可以不做)。接下來針對需求進一步分析:
網格
這個的需求肯定是調用 Axes.grid()
方法進行實現秩霍,注意它的線形是 -.
;顏色是灰色(gray)鸽照;
圖例
調用 Axes.legend()
方法進行實現矮燎,這里需要注意一下赔癌,legend()
方法并沒有提供 fontstyle
這個關鍵字參數,該方法只支持調整字號峡谊,并不支持設置字體樣式靖苇,所以我們得另辟蹊徑班缰,columns = [f'${i}$' for i in columns]
這是我的實現方法埠忘,通過將正常字符轉換成 Latex 字符的方式完成圖例文字的斜體樣式馒索,由于我們自定義了圖例文字绰上,那么就必須傳遞 handler,由于客戶給的數據只繪制了折線圖蜈块,所以可以調用 Axes.lines
方法獲得畫布中所有的 Line2D 實例百揭,這就是我們需要的 handler。最后如果不傳遞 ncols
這個關鍵字參數器一,那么所有的圖例會被放在一列,因此還需要設置 ncols=3
渺贤,圖例默認的擺放位置是 best
,這與需求不符丑掺,因此我們還要傳遞 loc='lower center'
進行更改述雾。
顏色帶
第一反應這個需求的實現肯定使用區(qū)域填充,直接調用 Axes.fill_between()
方法進行區(qū)域填充即可唆缴。填充的顏色使用的是 skyblue
面徽,建議大家盡量用字符串表示顏色趟紊,這樣看起來更加直觀碰酝,顏色帶的范圍可以通過全局變量顏色帶寬度進行控制送爸。
其他
最后就設置一下軸標簽和文字大小就行了袭厂。完整的代碼如下:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 默認帶狀圖顏色
DEFAULT_BETWEEN_COLOR = "skyblue"
# 默認抽樣點數
DEFAULT_SAMPLE = 4
# 默認顏色帶范圍
DEFAULT_SAMPLE_SIZE = 1
# 默認Y軸標簽
DEFAULT_TITLE = "NDVI"
df = pd.read_csv("pfree.csv", index_col=0)
columns = df.columns
columns = [f'${i}$' for i in columns]
M, N = df.shape
df.plot()
# 獲取最大值
df_max = df.max().max()
# 獲取最小值
df_min = df.min().min()
# 獲取Axes對象
axes = plt.gca()
# 畫網格
axes.grid(True, ls='-.', color='gray')
handler = axes.lines
# 畫圖例
axes.legend(loc='lower center', ncols=3, fontsize=10, handles=handler, labels=columns)
# 畫文本
between_lines = [(i, i + DEFAULT_SAMPLE_SIZE) for i in range(1, M, DEFAULT_SAMPLE)]
for lines in between_lines:
x1 = lines[0]
x2 = lines[1]
r = np.linspace(x1, x2, 1000)
# 畫帶狀圖
axes.fill_between(r, 0, 0.5,
color=f'{DEFAULT_BETWEEN_COLOR}', alpha=0.3)
# 設置Y軸顯示范圍
axes.set_ylim([0, 0.419])
# 設置Y軸標簽
axes.set_ylabel(DEFAULT_TITLE, fontsize=18)
plt.show()
畫圖效果如下:
文中難免會出現一些描述不當之處(盡管我已反復檢查多次)纹磺,歡迎在留言區(qū)指正,相關的知識點也可進行分享橄杨,希望大家都能有所收獲C刂ⅰ!如果覺得我的文章寫得還行历极,不妨支持一下。你的每一個轉發(fā)衷佃、關注、點贊、評論都是對我最大的支持锄列!