文章目錄
- 一、Matplotlib圖表樣式介紹
- 1. 圖表樣式簡介
- 2. 默認圖表樣式
- 2.1 查看默認配置
- 2.2 常用的配置
- 3. 圖表樣式修改
- 3.1 局部修改
- 3.1.1 通過繪圖方法設置參數修改
- 3.1.2 通過rcParams修改
- 3.1.3 通過rc()方法修改
- 3.2 全局修改
- 二、顏色設置
- 1. 顏色的三種表示方式
- 1.1 顏色單詞
- 1.2 16進制數
- 1.3 RGB和RGBA元組
- 1.4 顏色轉換工具網站
- 2. 顏色映射表
- 2.1 顏色映射表簡介
- 2.2 查看內置的顏色映射表
- 2.3 常用的顏色映射表
- 2.4 自定義顏色映射表
- 2.4.1 創建連續漸變顏色映射表
- 2.4.2 創建離散顏色映射表
- 2.5 使用顏色映射表
- 2.5.1 使用繪圖方法中的 cmap 參數
- 2.5.2 使用 set_cmap() 方法
- 2.6 示例:繪制賬單餅圖
- 三、線型設置
- 1. 線型介紹
- 2. 常用線型
- 3. 示例:繪制多條折線圖
- 四、數據標記設置
- 1. 數據標記介紹
- 2. 內置數據標記
- 3. 數據標記相關參數
- 4. 示例:繪制多條折線圖
- 五、字體樣式設置
- 1. 字體樣式介紹
- 2. 字體樣式相關方法及屬性
- 2.1 全局字體配置方法
- 2.2 局部文本設置函數
- 2.3 示例:繪制多條折線圖
- 六、主題樣式設置
- 1. 主題樣式介紹
- 2. 查看預定義的主題樣式
- 3. 使用主題樣式
- 3.1 全局應用:style.use()方法
- 3.2 臨時應用:style.context()方法
- 3.3 示例:繪制分區柱形圖
- 七、填充區域
- 1. 填充區域介紹
- 2. 使用填充區域
- 2.1 使用 fill() 填充
- 示例:繪制多邊形
- 2.2 使用 fill_between() 填充
- 示例:繪制單條折線圖
- 2.3 使用 fill_betweenx() 填充
- 示例:產品評分與價格區間的關系
一、Matplotlib圖表樣式介紹
1. 圖表樣式簡介
Matplotlib 的圖表樣式是指圖表的整體視覺呈現風格,包括顏色搭配、線條樣式、字體類型、網格線樣式、背景色等一系列視覺元素的組合。它決定了圖表的美觀度、專業性以及信息傳遞的效率。
合理的圖表樣式能夠讓數據可視化效果更符合展示場景(如學術報告、商業演示、日常分析等),同時也能幫助讀者更快速地聚焦于數據本身。Matplotlib 提供了豐富的樣式管理功能,既支持使用內置的預設樣式,也允許用戶根據需求自定義樣式,從而滿足不同的視覺偏好和業務需求。
2. 默認圖表樣式
2.1 查看默認配置
在 Matplotlib 中,matplotlib.rc_params()
函數用于獲取當前所有的默認配置參數,返回一個包含全局配置的字典。這些參數決定了圖表的默認樣式(如字體、顏色、線條、坐標軸等),是 Matplotlib 繪制圖表時的“默認規則”。
通過運行以下代碼,可以查看完整的默認配置:
import matplotlib
# 獲取并打印所有默認配置參數
default_config = matplotlib.rc_params()
print(default_config)
2.2 常用的配置
Matplotlib 的默認配置包含大量參數,以下是實際應用中最常用的配置項:
配置項分類 | 具體參數名 | 默認值 | 含義說明 |
---|---|---|---|
字體設置 | font.family | ['sans-serif'] | 全局字體族,默認使用無襯線字體(如 Arial、SimHei 等) |
font.size | 10 | 全局默認字體大小(單位:磅) | |
axes.titlesize | large | 圖表標題字體大小(相對值,可選 ‘xx-small’ 至 ‘xx-large’) | |
axes.labelsize | medium | 坐標軸標簽字體大小 | |
xtick.labelsize | medium | x 軸刻度標簽字體大小 | |
ytick.labelsize | medium | y 軸刻度標簽字體大小 | |
legend.fontsize | medium | 圖例標簽字體大小 | |
線條樣式 | lines.linewidth | 1.5 | 線條寬度(單位:點) |
lines.linestyle | '-' | 線條樣式('-' 實線、'--' 虛線、':' 點線等) | |
lines.marker | 'None' | 數據點標記樣式('o' 圓圈、's' 正方形等,默認無標記) | |
坐標軸設置 | axes.edgecolor | 'black' | 坐標軸邊框顏色 |
axes.grid | False | 是否顯示網格線(默認不顯示) | |
grid.linestyle | '--' | 網格線樣式(默認虛線) | |
grid.alpha | 0.7 | 網格線透明度(0-1,值越小越透明) | |
xtick.direction | 'in' | x 軸刻度線方向('in' 向內、'out' 向外) | |
ytick.direction | 'in' | y 軸刻度線方向 | |
圖例設置 | legend.loc | 'best' | 圖例位置('best' 自動選擇最優位置,或指定 'upper right' 等) |
legend.frameon | True | 是否顯示圖例邊框(默認顯示) | |
圖像輸出 | figure.figsize | (6.4, 4.8) | 圖表默認尺寸(寬×高,單位:英寸) |
figure.dpi | 100 | 圖表分辨率(每英寸像素數) | |
savefig.dpi | 100 | 保存圖片時的分辨率 | |
中文顯示 | font.sans-serif | ['DejaVu Sans', ...] | 無襯線字體列表(需添加 'SimHei' 等中文字體以支持中文顯示) |
axes.unicode_minus | True | 是否使用 Unicode 負號(設置為 False 可解決負號顯示異常問題) |
3. 圖表樣式修改
圖表樣式修改是Matplotlib數據可視化中的重要環節,通過調整樣式可以使圖表更符合展示需求和審美要求。根據修改范圍的不同,可分為局部修改和全局修改兩類。
3.1 局部修改
局部修改指的是僅對當前繪制的單個圖表生效的樣式調整,不會影響其他圖表的默認樣式。
3.1.1 通過繪圖方法設置參數修改
這是最直接的樣式修改方式,在調用繪圖函數(如plot()
、bar()
、scatter()
等)時,通過傳遞參數來指定當前圖表元素的樣式。
示例代碼:
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]# 使用 plot 函數繪制折線圖,x 和 y 是數據
plt.plot(x, y, linewidth=5)# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
3.1.2 通過rcParams修改
rcParams
是一個字典對象,存儲了Matplotlib的所有默認配置。通過臨時修改rcParams
中的參數,可以對當前代碼塊中后續繪制的圖表生效,但不會影響全局默認設置。
示例代碼:
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]# 使用 plot 函數繪制折線圖,x 和 y 是數據
# plt.plot(x, y, linewidth=5)
plt.rcParams['lines.linewidth'] = 5
plt.plot(x, y)# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
3.1.3 通過rc()方法修改
matplotlib.rc()
方法是修改配置的另一種方式,它可以一次性設置多個參數,語法上更簡潔。
示例代碼:
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]# 使用 plot 函數繪制折線圖,x 和 y 是數據
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
plt.plot(x, y)# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
3.2 全局修改
全局修改指的是修改Matplotlib的默認配置文件matplotlibrc
,使所有使用Matplotlib繪制的圖表都應用新的默認樣式,包括新啟動的程序。
Matplotlib的配置文件位置可以通過以下代碼查詢:
import matplotlib
print(matplotlib.matplotlib_fname())
二、顏色設置
在數據可視化中,顏色是傳遞信息、區分數據系列和提升圖表美觀度的重要元素。Matplotlib 支持多種顏色表示方式,靈活掌握這些方式能讓圖表配色更精準、更符合需求。
1. 顏色的三種表示方式
1.1 顏色單詞
顏色單詞是通過英文單詞直接表示顏色的方式,其特點是簡單直觀、易于理解和書寫,無需記憶復雜的數值,例如 “red”“blue”“green” 等,能快速應用于圖表元素的顏色設置;但這種方式支持的顏色單詞數量有限(約 140 種標準顏色),無法精確表達所有細微差別的色調,適用于對顏色精度要求不高的快速繪圖場景。
查看Matplotlib可用的顏色單詞:
from matplotlib import colors
print(colors.cnames.keys())
運行結果如下:
dict_keys(['aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple', 'rebeccapurple', 'red', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen'])
示例代碼:
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]# 使用 plot 函數繪制折線圖,x 和 y 是數據
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
plt.plot(x, y, color='blue')# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
1.2 16進制數
16 進制數表示顏色的格式為#RRGGBB
或#RRGGBBAA
(其中RR“GG”“BB” 分別代表紅、綠、藍三色通道數值,AA代表透明度,取值范圍為00-FF,對應十進制 0-255),其特點是可表示約 1677 萬種顏色,能精準匹配任意色調,且透明度可選(00完全透明,FF完全不透明),通用性強;但該方式對字符串格式要求嚴格,較難記憶,適用于需要精準配色的網頁或印刷圖表等場景。
示例代碼:
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]# 使用 plot 函數繪制折線圖,x 和 y 是數據
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
# plt.plot(x, y, color='blue')
plt.plot(x, y, color='#56a8ffa5')# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
1.3 RGB和RGBA元組
RGB 通過紅(Red)、綠(Green)、藍(Blue)三原色組合表示顏色,有整數格式(R, G, B)(R、G、B 為 0-255 的整數)和浮點數格式(R, G, B)(R、G、B 為 0-1 的浮點數,由 0-255 范圍歸一化而來)兩種形式,其特點是顏色豐富,數值直觀,支持歸一化處理,能精確控制三通道強度;不過整數格式需注意數值范圍,使用時稍顯繁瑣,適用于程序中動態生成顏色、需要精確控制三通道的場景。
RGBA 元組是在 RGB 三原色基礎上增加了 Alpha(透明度)通道的顏色表示方式,格式為(R, G, B, A),其中前三個值(R、G、B)分別代表紅、綠、藍三原色的強度,第四個值(A)代表透明度。其數值格式有兩種:整數格式中,R、G、B、A 的取值范圍為 0-255(A=0 表示完全透明,A=255 表示完全不透明);浮點數格式中,所有值的取值范圍為 0-1(A=0 表示完全透明,A=1 表示完全不透明),這種格式在 Matplotlib 中更為常用。RGBA 元組的特點是既保留了 RGB 模式對顏色的精準控制能力,又通過 Alpha 通道實現了對透明度的靈活調節,能輕松處理圖表元素的疊加顯示效果,避免因元素重疊導致的信息遮擋;但相比單純的 RGB,它需要多設置一個透明度參數,且整數格式需注意數值范圍限制,適用于需要處理元素疊加、強調層次關系的復雜圖表場景,例如重疊的散點圖、多層折線圖等。
示例代碼:
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]# 使用 plot 函數繪制折線圖,x 和 y 是數據
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
# plt.plot(x, y, color='blue')
# plt.plot(x, y, color='#56a8ffa5')
plt.plot(x, y, color=(0.8, 0.5, 0.6, 0.5))# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
1.4 顏色轉換工具網站
https://tool.css-js.com/rgba.html是一個顏色轉換工具網站。它主要用于實現RGB、RGBA顏色值與十六進制顏色值之間的轉換。
用戶在該網站輸入符合格式要求的RGB、RGBA數值或十六進制顏色值,頁面會實時轉換并顯示對應的其他格式顏色值。例如,輸入“rgb(255,0,0)”,會顯示其對應的十六進制顏色值“#FF0000”,反之亦然。該網站對于網頁設計師、前端開發人員等需要頻繁處理顏色值的人群來說,是一個方便快捷的工具,有助于提高顏色值轉換的效率。
2. 顏色映射表
2.1 顏色映射表簡介
顏色映射表(Colormap,簡稱cmap)是一系列漸變顏色的有序集合,用于將數值映射到顏色,實現數據的可視化編碼。它通過顏色的深淺、色調變化直觀反映數據值的大小或差異,尤其適合熱力圖、等高線圖、散點圖(按數值著色)等場景。顏色映射表的核心作用是將抽象的數值轉化為視覺可感知的顏色差異,幫助讀者快速識別數據分布規律(如高低值區域、趨勢變化等)。Matplotlib內置了多種預設的顏色映射表,涵蓋從單色調漸變到多色調過渡的不同類型,同時支持用戶自定義顏色映射表以滿足特定需求。
2.2 查看內置的顏色映射表
Matplotlib提供了plt.colormaps()
函數查看所有內置顏色映射表,通過plt.cm.get_cmap()
可獲取指定映射表,通過可視化方式可直觀了解其顏色變化規律。
import matplotlib.pyplot as plt
print(plt.colormaps())
運行結果如下:
['magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'twilight_shifted', 'turbo', 'Blues', 'BrBG', 'BuGn', 'BuPu', 'CMRmap', 'GnBu', 'Greens', 'Greys', 'OrRd', 'Oranges', 'PRGn', 'PiYG', 'PuBu', 'PuBuGn', 'PuOr', 'PuRd', 'Purples', 'RdBu', 'RdGy', 'RdPu', 'RdYlBu', 'RdYlGn', 'Reds', 'Spectral', 'Wistia', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd', 'afmhot', 'autumn', 'binary', 'bone', 'brg', 'bwr', 'cool', 'coolwarm', 'copper', 'cubehelix', 'flag', 'gist_earth', 'gist_gray', 'gist_heat', 'gist_ncar', 'gist_rainbow', 'gist_stern', 'gist_yarg', 'gnuplot', 'gnuplot2', 'gray', 'hot', 'hsv', 'jet', 'nipy_spectral', 'ocean', 'pink', 'prism', 'rainbow', 'seismic', 'spring', 'summer', 'terrain', 'winter', 'Accent', 'Dark2', 'Paired', 'Pastel1', 'Pastel2', 'Set1', 'Set2', 'Set3', 'tab10', 'tab20', 'tab20b', 'tab20c', 'magma_r', 'inferno_r', 'plasma_r', 'viridis_r', 'cividis_r', 'twilight_r', 'twilight_shifted_r', 'turbo_r', 'Blues_r', 'BrBG_r', 'BuGn_r', 'BuPu_r', 'CMRmap_r', 'GnBu_r', 'Greens_r', 'Greys_r', 'OrRd_r', 'Oranges_r', 'PRGn_r', 'PiYG_r', 'PuBu_r', 'PuBuGn_r', 'PuOr_r', 'PuRd_r', 'Purples_r', 'RdBu_r', 'RdGy_r', 'RdPu_r', 'RdYlBu_r', 'RdYlGn_r', 'Reds_r', 'Spectral_r', 'Wistia_r', 'YlGn_r', 'YlGnBu_r', 'YlOrBr_r', 'YlOrRd_r', 'afmhot_r', 'autumn_r', 'binary_r', 'bone_r', 'brg_r', 'bwr_r', 'cool_r', 'coolwarm_r', 'copper_r', 'cubehelix_r', 'flag_r', 'gist_earth_r', 'gist_gray_r', 'gist_heat_r', 'gist_ncar_r', 'gist_rainbow_r', 'gist_stern_r', 'gist_yarg_r', 'gnuplot_r', 'gnuplot2_r', 'gray_r', 'hot_r', 'hsv_r', 'jet_r', 'nipy_spectral_r', 'ocean_r', 'pink_r', 'prism_r', 'rainbow_r', 'seismic_r', 'spring_r', 'summer_r', 'terrain_r', 'winter_r', 'Accent_r', 'Dark2_r', 'Paired_r', 'Pastel1_r', 'Pastel2_r', 'Set1_r', 'Set2_r', 'Set3_r', 'tab10_r', 'tab20_r', 'tab20b_r', 'tab20c_r']
示例:使用圖形方式查看指定映射表
import matplotlib.pyplot as plt
import numpy as np# 設置中文字體以正常顯示中文標簽
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解決Matplotlib中負號'-'顯示為方塊的問題
plt.rcParams['axes.unicode_minus'] = False# 定義一個函數來展示顏色映射表(兼容新版本Matplotlib)
def plot_cmap(cmap_name):"""展示給定名稱的顏色映射表。參數:cmap_name (str): 顏色映射表的名稱"""# 檢查指定的顏色映射表是否存在if cmap_name not in plt.colormaps():print(f"警告:顏色映射表 '{cmap_name}' 不存在!")return# 獲取顏色映射表對象(適用于新的Matplotlib版本)cmap = plt.colormaps[cmap_name] # 或者使用 plt.colormaps.get_cmap(cmap_name)# 創建一個新的圖形,寬度為6英寸,高度為1英寸plt.figure(figsize=(6, 1))# 創建一個從0到1的線性間隔數組,長度為256。這個數組代表顏色映射的范圍gradient = np.linspace(0, 1, 256)# 將上述數組堆疊成二維數組,以便在imshow中顯示為顏色條gradient = np.vstack((gradient, gradient))# 使用imshow繪制顏色映射表,aspect='auto'表示自動調整寬高比,# cmap參數指定使用的顏色映射表plt.imshow(gradient, aspect='auto', cmap=cmap)# 移除x軸和y軸的刻度標記plt.xticks([])plt.yticks([])# 添加標題,并設置距離底部的距離為10點plt.title(f'顏色映射表:{cmap_name}', pad=10)# 自動調整布局以防圖表元素重疊plt.tight_layout()# 顯示圖像plt.show()# 示例調用,展示名為'viridis'和'coolwarm'的顏色映射表
plot_cmap('viridis')
plot_cmap('coolwarm')
運行結果如下圖所示:
2.3 常用的顏色映射表
類別 | 名稱 | 特點 | 適用場景 |
---|---|---|---|
連續漸變 | viridis | 從黃到藍的漸變,色調均勻,對色盲友好,對比度適中 | 大多數科學可視化,如熱力圖、等高線圖 |
連續漸變 | plasma | 從紅到紫的暖色調漸變,色彩鮮艷,突出高值區域 | 強調數據中的熱點(高值)區域 |
連續漸變 | inferno | 從黑到黃的漸變,類似火焰顏色,高值區域明亮 | 表示溫度、能量等具有“熱度”屬性的數據 |
連續漸變 | magma | 從黑到紅的漸變,高對比度,高值區域突出 | 需要強調數據極端值的場景 |
連續漸變 | cividis | 從淺灰到藍綠色的漸變,對色盲和灰度打印友好 | 學術論文、需要灰度打印的場景 |
發散型 | coolwarm | 從藍色(冷)到紅色(暖)的發散漸變,中間為白色 | 表示正負偏離(如溫度異常、誤差值) |
發散型 | bwr | 藍-白-紅發散漸變,對比強烈,適合展示對立數據 | 正負值對比,如增益/損失、上升/下降 |
定性型 | tab10 | 10種鮮明的區分色,無漸變,適合離散類別 | 分類數據,如不同組別、類別對比 |
定性型 | Set3 | 12種柔和的區分色,適合多類別展示 | 多分類數據,如多個組別比較 |
線性漸變 | gray | 從黑到白的灰度漸變,簡潔中立 | 需要避免顏色干擾的場景,或模擬灰度圖像 |
2.4 自定義顏色映射表
當Matplotlib內置的顏色映射表無法滿足特定需求(如品牌色調匹配、數據語義強化等)時,可通過自定義顏色映射表實現個性化配色。常用方法有兩種:基于漸變的連續顏色映射表和基于離散顏色集合的映射表,分別適用于不同場景。
2.4.1 創建連續漸變顏色映射表
使用LinearSegmentedColormap
類,通過指定關鍵顏色節點,自動生成平滑過渡的漸變效果。
代碼示例:
# 導入必要的庫
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap # 用于創建自定義顏色映射表# 設置中文字體,確保圖表中的中文標簽能正常顯示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑體(SimHei)顯示中文
# 解決負號 '-' 顯示為方塊的問題,保證負數的負號正常顯示
plt.rcParams['axes.unicode_minus'] = False# 定義一組顏色,用于構建自定義的藍色漸變色系
# 顏色從最淺的藍色(接近白色)到深藍色,形成一個平滑的視覺過渡
colors = ["#e6f7ff", # 極淺藍(背景色)"#bae7ff", # 很淺的藍"#91d5ff", # 淺藍"#69b1ff", # 中等淺藍"#4096ff", # 中藍"#1872ff", # 深藍"#0050c3" # 更深的藍(接近海軍藍)
]# 使用 LinearSegmentedColormap.from_list 創建一個連續的顏色映射表
custom_cmap = LinearSegmentedColormap.from_list(name="custom_blue", # 自定義顏色映射表的名稱(可選)colors=colors, # 顏色列表,定義漸變的起點到終點N=256 # 漸變的色階數量,256 是常用值,數值越大過渡越平滑
)# 定義一個函數,用于可視化任意顏色映射表
def plot_cmap(cmap):"""展示顏色映射表的漸變效果參數:cmap: matplotlib.colors.Colormap 對象"""plt.figure(figsize=(6, 2)) # 創建一個寬而矮的圖形,適合展示色條# 創建一個從 0 到 1 的線性數組,共 256 個值,代表顏色映射的范圍gradient = np.linspace(0, 1, 256)# 將一維數組堆疊成兩行,形成一個 2x256 的二維數組,便于在圖像中顯示為色帶gradient = np.vstack((gradient, gradient))# 使用 imshow 顯示顏色漸變條plt.imshow(gradient, aspect="auto", cmap=cmap) # aspect="auto" 允許自動調整寬高比plt.axis("off") # 關閉坐標軸(不顯示刻度、邊框等)# 添加標題,顯示當前顏色映射表的名稱plt.title(f"自定義連續顏色映射表: {cmap.name}")plt.show() # 顯示圖形# 調用函數,展示我們剛剛創建的自定義藍色漸變映射表
plot_cmap(custom_cmap)
運行結果如下圖所示:
2.4.2 創建離散顏色映射表
使用ListedColormap
類,直接指定有限個離散顏色,適用于分類數據的顏色編碼。
代碼示例:
# 導入必要的庫
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap# 設置中文字體,確保圖表中的中文標簽能正常顯示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑體(SimHei)顯示中文
# 解決負號 '-' 顯示為方塊的問題,保證負數的負號正常顯示
plt.rcParams['axes.unicode_minus'] = False# 定義離散顏色集合(適合多類別數據)
discrete_colors = ["#ff4d4f", "#faad14", "#52c41a", "#1890ff", "#722ed1"]# 創建離散顏色映射表
discrete_cmap = ListedColormap(colors=discrete_colors,name="custom_discrete"
)# 定義一個函數,用于可視化任意顏色映射表
def plot_cmap(cmap):"""展示顏色映射表的漸變效果參數:cmap: matplotlib.colors.Colormap 對象"""plt.figure(figsize=(6, 2)) # 創建一個寬而矮的圖形,適合展示色條# 創建一個從 0 到 1 的線性數組,共 256 個值,代表顏色映射的范圍gradient = np.linspace(0, 1, 256)# 將一維數組堆疊成兩行,形成一個 2x256 的二維數組,便于在圖像中顯示為色帶gradient = np.vstack((gradient, gradient))# 使用 imshow 顯示顏色漸變條plt.imshow(gradient, aspect="auto", cmap=cmap) # aspect="auto" 允許自動調整寬高比plt.axis("off") # 關閉坐標軸(不顯示刻度、邊框等)# 添加標題,顯示當前顏色映射表的名稱plt.title(f"自定義離散顏色映射表: {cmap.name}")plt.show() # 顯示圖形# 調用函數,展示我們剛剛創建的自定義藍色漸變映射表
plot_cmap(discrete_cmap)
運行結果如下圖所示:
2.5 使用顏色映射表
在數據可視化里,顏色映射表(Colormap)是將數據數值與顏色關聯的重要工具,借助它能讓數據規律借由色彩變化直觀呈現。下面介紹兩種在 Matplotlib 中運用顏色映射表的常用方式,助力精準調控圖表色彩編碼邏輯。
2.5.1 使用繪圖方法中的 cmap 參數
在 Matplotlib 各類繪圖函數(像 imshow
繪制熱力圖、scatter
繪制散點圖 等)里,cmap
參數可直接指定顏色映射表。使用時,數據值會被自動歸一化到 [0, 1]
區間,對應顏色映射表的起始與結束顏色,以此完成數據到色彩的映射。該方式針對單圖表或臨時配色場景極為便捷,一行代碼就能讓當前繪圖函數應用指定顏色映射,快速實現數據色彩編碼,無需額外操作步驟,直接讓顏色映射對當前繪制圖表生效,清晰展現數據分布特征,比如用漸變映射表體現連續數據變化、離散映射表區分分類數據 。
示例代碼:
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]# 使用 plot 函數繪制折線圖,x 和 y 是數據
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
# plt.plot(x, y, color='blue')
# plt.plot(x, y, color='#56a8ffa5')
# plt.plot(x, y, color=(0.8, 0.5, 0.6, 0.5))
# plt.scatter(x, y, color=matplotlib.cm.viridis(y))
plt.bar(x, y, color=matplotlib.cm.viridis(y))
# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
2.5.2 使用 set_cmap() 方法
set_cmap()
方法主要用于對已創建的 Axes
(坐標軸)或 Figure
(畫布)對象批量設置顏色映射。在多子圖布局、需復用映射表或者交互可視化場景中優勢顯著。調用該方法后,關聯的圖表都會應用新設置的顏色映射,能統一多圖表配色風格,也便于動態切換映射表探索數據。例如多子圖展示時,可通過它讓不同子圖共享一致顏色映射規則;交互場景下,結合函數綁定操作,能實時切換顏色映射,助力深入分析數據分布與特征 。
示例代碼:
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]# 使用 plot 函數繪制折線圖,x 和 y 是數據
# plt.plot(x, y, linewidth=5)
# plt.rcParams['lines.linewidth'] = 5
plt.rc('lines', linewidth=5)
# plt.plot(x, y, color='blue')
# plt.plot(x, y, color='#56a8ffa5')
# plt.plot(x, y, color=(0.8, 0.5, 0.6, 0.5))
# plt.scatter(x, y, color=matplotlib.cm.viridis(y))
# plt.bar(x, y, color=matplotlib.cm.viridis(y))# 繪制散點圖,x 和 y 分別表示點的橫縱坐標
# 參數 c=y 表示散點的顏色將根據 y 值的大小進行映射(即顏色隨 y 值變化)
# 此時 Matplotlib 會自動使用默認的顏色映射表(colormap)來著色
plt.scatter(x, y, c=y)# 手動設置當前圖形使用的顏色映射表為 'viridis'
# matplotlib.cm.viridis 是 Matplotlib 內置的一種感知均勻、美觀且適合色盲的顏色映射
# 這行代碼確保散點圖的顏色使用 viridis 色圖進行渲染
plt.set_cmap(matplotlib.cm.viridis)
# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
2.6 示例:繪制賬單餅圖
數據如下圖所示,需要根據這個數據繪制賬單餅圖,手動給不同的區域設置不同的顏色。
實現代碼如下圖所示:
# 導入matplotlib.pyplot模塊,用于繪圖功能。
import matplotlib.pyplot as plt# 導入pandas模塊,并使用pd作為別名。Pandas是一個強大的數據處理和分析庫。
import pandas as pd# 設置matplotlib的中文字體為SimHei(黑體),以確保中文標簽可以正常顯示。
plt.rcParams['font.sans-serif'] = ['SimHei']# 解決負號'-'顯示為方塊的問題,通過設置'axes.unicode_minus'為False來實現。
plt.rcParams['axes.unicode_minus'] = False# 定義包含CSV文件路徑的變量。這里假設賬單數據存儲在一個名為'賬單.csv'的文件中。
csv_file_path = './data/賬單.csv'# 使用pandas的read_csv函數讀取CSV文件中的數據,并將其存儲在一個DataFrame對象中。
df = pd.read_csv(csv_file_path)# 從DataFrame中提取'金額'列的數據,用于表示餅圖各個部分的大小或貢獻度。
x = df['金額']# 從DataFrame中提取'支出分類'列的數據,用作餅圖各部分的標簽,以便了解每個部分代表什么。
labels = df['支出分類']# 定義顏色列表(數量需與分類數量一致)
custom_colors = ['#FF6B6B', # 淺紅色'#4ECDC4', # 青綠色'#45B7D1', # 天藍色'#FFA07A', # 淺橙色'#98D8C8', # 淡青色'#F7DC6F', # 淡黃色'#D7BDE2', # 淡紫色'#58D68D' # 淺綠色
]# 使用plt.pie()函數繪制餅圖:
# 參數x指定數據列表,決定了餅圖各個扇區的大小;
# labels參數指定與x列表對應的數據標簽,幫助識別每個扇區所代表的類別;
# autopct參數設置為'%.1f%%',用于在餅圖上顯示百分比數值,保留一位小數。
plt.pie(x=x, labels=labels, autopct='%.1f%%', colors=custom_colors)# 調用plt.show()函數顯示圖形結果。這是展示已創建圖表的必要步驟。
plt.show()
繪制的圖形如下圖所示:
三、線型設置
線型是圖表中線條的外觀樣式,包括線條的形態(如實線、虛線)、粗細、端點樣式等,它不僅影響圖表的美觀度,還能幫助區分不同的數據系列,增強圖表的可讀性。合理的線型選擇可以讓數據趨勢和對比關系更加清晰,例如用虛線表示預測數據,用實線表示實際數據,便于讀者快速識別。
1. 線型介紹
線型主要通過線條的樣式特征來定義,核心要素包括線條的連續性(如實線、虛線、點線)、線條的寬度(線寬)以及線條端點和連接處的樣式。在 Matplotlib 中,線型的設置可以通過繪圖函數(如 plot()
)的參數直接指定,也可以通過全局配置(如 rcParams
)統一設置默認線型。不同的線型適用于不同的場景:連續數據的趨勢展示常用實線,輔助參考線常用虛線或點線,而特殊標記(如誤差線)可能會用到點劃線等。通過組合不同的線型,能夠有效區分圖表中的多個數據系列,避免混淆。
2. 常用線型
線型參數值 | 線型名稱 | 外觀示例 | 適用場景說明 |
---|---|---|---|
'-' | 實線 | ───────────── | 最常用的線型,適用于展示主要數據系列、核心趨勢線,如實際觀測數據、基準值等。 |
'--' | 虛線 | ── ── ── ── ── | 常用于輔助線、參考線或次要數據系列,如預測值、目標閾值、歷史對比數據等。 |
':' | 點線 | ············· | 適合表示次要參考信息或背景線,如網格輔助線、理論邊界線,視覺干擾較小。 |
'-.' | 點劃線 | ─·─·─·─·─·─·─ | 用于需要一定區分度但又不突出的線條,如模擬數據、假設曲線,兼顧辨識度和簡潔性。 |
'None' | 無線條 | (無顯示) | 用于隱藏線條,僅展示數據點標記(如散點圖中單獨標記點),或臨時取消線條顯示。 |
上表中的線型參數值可直接用于 plot()
等函數的 linestyle
(或簡寫 ls
)參數,例如 plt.plot(x, y, linestyle='--')
或 plt.plot(x, y, ls=':')
。實際使用時,可根據數據的重要性、圖表的復雜度以及展示目標,選擇合適的線型組合,以達到清晰傳遞信息的目的。
3. 示例:繪制多條折線圖
繪制兩條折線圖,兩條折線圖分別用不同的線型,并給網格線設置與折線不同的線型。
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]
y2 = [12, 16, 20, 30, 40, 60, 70, 80, 95, 100]# 使用 plot 函數繪制折線圖,x 和 y 是數據
plt.plot(x, y, linestyle=':')
plt.plot(x, y2, linestyle='-.')# 設置圖表網格線
plt.grid(visible=True, linestyle='--')# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
四、數據標記設置
在折線圖、散點圖等可視化場景里,數據標記用于突出顯示具體數據點位置,幫助讀者精準識別數據坐標,區分不同數據系列,也可強調關鍵數據(如峰值、異常點 )。合理運用數據標記,能讓數據分布與趨勢更直觀呈現。
1. 數據標記介紹
數據標記是依附于數據點的符號,在 Matplotlib 中,可通過 marker
參數在 plot
、scatter
等函數里設置。它能讓數據點從線條中“凸顯”,即便線條復雜或數據點密集,也能清晰定位,還可借助不同標記樣式、顏色、大小等區分多組數據,是增強圖表可讀性的基礎元素。
2. 內置數據標記
Matplotlib 提供豐富內置數據標記,通過特定字符/符號調用,滿足多樣可視化需求:
數據標記取值 | 符號示例 | 說明 | 數據標記取值 | 符號示例 | 說明 | 數據標記取值 | 符號示例 | 說明 |
---|---|---|---|---|---|---|---|---|
's' | ■ | 正方形 | '+' | + | 加號 | '4' | ? | 朝左方向鍵,位于基線右方 |
'8' | ● | 八邊形 | ',' | · | 像素點 | '5' | ? | 朝右方向鍵,位于基線左方 |
'>' | ? | 右三角 | '.' | ? | 點 | '6' | ▲ | 朝上方向鍵,位于基線下方 |
'<' | ? | 左三角 | '1' | Y | 下三叉 | '7' | ▼ | 朝下方向鍵,位于基線上方 |
'^' | ▲ | 正三角 | '2' | 人 | 上三叉 | '8' | ? | 朝左方向鍵,位于基線左方 |
'v' | ▼ | 倒三角 | '3' | ← | 左三叉 | '9' | ? | 朝右方向鍵,位于基線右方 |
'o' | ● | 圓形 | '4' | → | 右三叉 | '10' | ▲ | 朝上方向鍵,位于基線上方 |
'X' | ? | 叉形 | 'x' | × | 乘號 | '11' | ▼ | 朝下方向鍵,位于基線下方 |
'P' | ? | 十字交叉形 | '-' | — | 水平線 | 'H' | □ | 六邊形1 |
'd' | ? | 長菱形 | '0' | — | 水平線,位于基線左方 | 'h' | □ | 六邊形2 |
'D' | ◆ | 正菱形 | '1' | — | 水平線,位于基線右方 | '*' | ★ | 星形 |
使用時,在繪圖函數里通過 marker
參數指定,如 plt.plot(x, y, marker='o')
,讓折線圖數據點顯示為圓形標記。
3. 數據標記相關參數
除標記樣式,Matplotlib 還提供參數精細調控標記外觀,讓可視化更貼合需求:
參數名 | 作用說明 | 示例值 | 補充說明 |
---|---|---|---|
markersize / ms | 控制數據標記大小 | 10 、8.5 | 數值越大,標記顯示越醒目 |
markerfacecolor / mfc | 設置標記內部填充色 | 'red' 、'#FF0000' | 可填顏色名稱、十六進制值等 |
markeredgecolor / mec | 設置標記邊緣顏色 | 'black' 、(0,0,0) | 支持顏色名稱、RGB 元組格式 |
markeredgewidth / mew | 調整標記邊緣寬度 | 2 、1.2 | 數值越大,邊緣線條越粗 |
markevery | 控制標記顯示間隔 | 2 、slice(0,None,3) | 如 markevery=2 表示每 2 個點顯示一個標記 |
4. 示例:繪制多條折線圖
繪制兩條折線圖,兩條折線圖分別用不同的線型,給網格線設置與折線不同的線型,并添加數據標記。
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]
y2 = [12, 16, 20, 30, 40, 60, 70, 80, 95, 100]# 使用 plt.plot() 繪制第一條折線圖
plt.plot(x, y, # x 和 y 是數據點的橫縱坐標數組(或列表)linestyle=':', # 線條樣式為“點線”(dotted line)marker='o', # 數據點標記形狀為“圓形”(circle)markersize=8, # 標記的大小為 8markerfacecolor='lightblue', # 標記內部填充顏色為“淺藍色”markeredgecolor='black', # 標記邊緣(輪廓)顏色為“黑色”markeredgewidth=2, # 標記邊緣的線寬為 2,使輪廓更明顯markevery=2 # 每隔 2 個點繪制一個標記(即只在第0、2、4...個點顯示標記)
)# 使用 plt.plot() 繪制第二條折線圖(例如對比數據 y2)
plt.plot(x, y2, # x 為橫坐標,y2 為第二組縱坐標數據linestyle='-.', # 線條樣式為“點劃線”(dash-dot line)marker='D', # 數據點標記形狀為“菱形”(Diamond)markersize=8, # 標記大小為 8markerfacecolor='#a5c8fa', # 標記內部填充顏色(十六進制淺藍)markeredgecolor='#fa853f', # 標記邊緣顏色(十六進制橙色)markeredgewidth=1, # 標記邊緣線寬為 1markevery=1 # 每個數據點都顯示標記(等價于全部顯示)
)# 設置圖表網格線
plt.grid(visible=True, linestyle='--')# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
五、字體樣式設置
字體樣式是圖表中文字展示效果的關鍵要素,包括字體類型、大小、粗細、風格等,直接影響圖表的可讀性和專業性。合理的字體設置能讓圖表標題、標簽、圖例等文本信息清晰傳達,同時與圖表整體風格保持協調,尤其在中文顯示、學術報告或商業展示等場景中至關重要。
1. 字體樣式介紹
字體樣式主要通過字體族(如宋體、黑體、Arial)、字體大小、粗細(常規、粗體)、風格(常規、斜體)、顏色等參數定義,用于控制圖表中所有文本元素(標題、坐標軸標簽、刻度標簽、圖例等)的外觀。在 Matplotlib 中,字體樣式的設置可分為全局配置(通過 rcParams
或 rc()
方法統一設置所有文本)和局部設置(在具體文本函數中單獨指定參數),前者適合批量統一風格,后者適合個性化調整特定文本元素。此外,針對中文顯示問題,需通過配置支持中文的字體族(如 SimHei
、WenQuanYi Micro Hei
)避免亂碼。
2. 字體樣式相關方法及屬性
Matplotlib 提供了多種方法設置字體樣式,核心包括全局配置方法和局部文本設置函數。
2.1 全局字體配置方法
通過 plt.rcParams
字典或 plt.rc()
方法修改全局字體默認樣式,對所有圖表生效。
方法/屬性 | 作用描述 | 常用參數/鍵名 | 參數說明 |
---|---|---|---|
plt.rcParams | 全局配置字典,存儲字體相關默認參數 | 'font.family' | 字體族列表,如 ['SimHei', 'Arial'] (優先使用前者) |
'font.size' | 全局默認字體大小(單位:磅),如 12 | ||
'axes.titlesize' | 坐標軸標題字體大小,如 14 或 'large' | ||
'axes.labelsize' | 坐標軸標簽字體大小,如 12 或 'medium' | ||
'xtick.labelsize' | x 軸刻度標簽字體大小,如 10 或 'small' | ||
'ytick.labelsize' | y 軸刻度標簽字體大小,同 xtick.labelsize | ||
'legend.fontsize' | 圖例字體大小,如 10 或 'small' | ||
plt.rc() | 批量設置全局參數的函數 | font | 字體參數字典,如 {'family': 'SimHei', 'size': 12} |
axes | 坐標軸文本參數,如 {'titlesize': 14, 'labelsize': 12} |
示例代碼:
import matplotlib.pyplot as plt# 方法1:通過rcParams設置
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei"] # 支持中文
plt.rcParams["font.size"] = 12 # 全局字體大小
plt.rcParams["axes.titlesize"] = 14 # 標題大小# 方法2:通過rc()批量設置
plt.rc('font', family='SimHei', size=12)
plt.rc('axes', titlesize=14, labelsize=12)
2.2 局部文本設置函數
在具體文本元素(標題、標簽等)的生成函數中,通過參數單獨設置字體樣式,僅對當前元素生效。
函數名 | 作用描述 | 常用參數 | 參數說明 |
---|---|---|---|
plt.title() | 設置圖表標題 | fontfamily | 字體族,如 'SimHei' 、'Arial' |
fontsize | 字體大小(單位:磅),如 14 或 'large' | ||
fontweight | 字體粗細,如 'bold' (粗體)、'normal' (常規)或數值 700 (對應粗體) | ||
fontstyle | 字體風格,如 'italic' (斜體)、'normal' (常規) | ||
color | 字體顏色,如 'red' 、'#FF0000' | ||
plt.xlabel() /plt.ylabel() | 設置坐標軸標簽 | 同 plt.title() 的參數 | 包括 fontfamily 、fontsize 、fontweight 等,用法一致 |
plt.xticks() /plt.yticks() | 設置刻度標簽 | fontproperties | 字體屬性對象(matplotlib.font_manager.FontProperties ),可指定字體族等 |
fontsize | 刻度標簽字體大小,如 10 | ||
plt.legend() | 設置圖例 | fontsize | 圖例字體大小,如 10 或 'small' |
fontfamily | 圖例字體族,如 'SimHei' | ||
plt.text() | 在圖表任意位置添加文本 | 同 plt.title() 的參數 | 支持 fontfamily 、fontsize 、fontstyle 等,用于自定義文本 |
2.3 示例:繪制多條折線圖
繪制兩條折線圖,兩條折線圖分別用不同的線型,給網格線設置與折線不同的線型,添加數據標記,并給標題設置字體樣式。
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 定義 x 軸數據:年份從 2010 到 2019
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]# 定義 y 軸數據:對應年份的數值
y = [10, 15, 18, 25, 30, 50, 65, 70, 80, 95]
y2 = [12, 16, 20, 30, 40, 60, 70, 80, 95, 100]# 使用 plt.plot() 繪制第一條折線圖
plt.plot(x, y, # x 和 y 是數據點的橫縱坐標數組(或列表)linestyle=':', # 線條樣式為“點線”(dotted line)marker='o', # 數據點標記形狀為“圓形”(circle)markersize=8, # 標記的大小為 8markerfacecolor='lightblue', # 標記內部填充顏色為“淺藍色”markeredgecolor='black', # 標記邊緣(輪廓)顏色為“黑色”markeredgewidth=2, # 標記邊緣的線寬為 2,使輪廓更明顯markevery=2 # 每隔 2 個點繪制一個標記(即只在第0、2、4...個點顯示標記)
)# 使用 plt.plot() 繪制第二條折線圖(例如對比數據 y2)
plt.plot(x, y2, # x 為橫坐標,y2 為第二組縱坐標數據linestyle='-.', # 線條樣式為“點劃線”(dash-dot line)marker='D', # 數據點標記形狀為“菱形”(Diamond)markersize=8, # 標記大小為 8markerfacecolor='#a5c8fa', # 標記內部填充顏色(十六進制淺藍)markeredgecolor='#fa853f', # 標記邊緣顏色(十六進制橙色)markeredgewidth=1, # 標記邊緣線寬為 1markevery=1 # 每個數據點都顯示標記(等價于全部顯示)
)# 設置圖表網格線
plt.grid(visible=True, linestyle='--')# 設置圖表標題
plt.title(label='多條折線圖', # 標題內容fontfamily='SimHei', # 字體類型fontsize=16, # 字體大小:16color='red', # 標題文字顏色rotation=10 # 旋轉角度
)# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
六、主題樣式設置
主題樣式是 Matplotlib 中預設的一套完整圖表風格配置,涵蓋字體、顏色、線型、網格線、邊框等所有視覺元素的默認參數,能快速統一圖表的整體外觀,無需逐一調整細節。合理使用主題樣式可大幅提升圖表的美觀度和專業性,同時減少重復的樣式配置工作,尤其適合批量生成風格一致的圖表(如報告、論文、儀表盤等)。
1. 主題樣式介紹
主題樣式(Style)是 Matplotlib 封裝的一套“一站式”樣式方案,包含對圖表中幾乎所有元素(如背景色、線條樣式、字體設置、網格線顯示等)的默認配置。它的核心作用是:
- 簡化樣式設置流程:無需手動調整
rcParams
中的數百個參數,直接調用主題即可應用整套風格; - 保證風格一致性:同一主題下的所有圖表自動保持視覺統一,避免因手動設置導致的風格混亂;
- 適配不同場景:預定義主題涵蓋簡約、學術、出版等多種風格,可根據需求快速切換(如論文用
seaborn-paper
,演示用Solarize_Light2
)。
主題樣式本質上是對 rcParams
的預定義集合,應用主題后,全局的默認配置會被主題中的參數覆蓋,后續繪制的所有圖表都會遵循該主題風格。
2. 查看預定義的主題樣式
Matplotlib 內置了多種預定義主題樣式,可通過以下代碼查看所有可用主題:
import matplotlib.style as ms
print(ms.available)
運行結果(不同版本可能略有差異):
['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-v0_8', 'seaborn-v0_8-bright', 'seaborn-v0_8-colorblind', 'seaborn-v0_8-dark', 'seaborn-v0_8-dark-palette', 'seaborn-v0_8-darkgrid', 'seaborn-v0_8-deep', 'seaborn-v0_8-muted', 'seaborn-v0_8-notebook', 'seaborn-v0_8-paper', 'seaborn-v0_8-pastel', 'seaborn-v0_8-poster', 'seaborn-v0_8-talk', 'seaborn-v0_8-ticks', 'seaborn-v0_8-white', 'seaborn-v0_8-whitegrid', 'tableau-colorblind10']
以下是 Matplotlib 中常用主題樣式的詳細介紹,結合其特點和適用場景整理如下:
主題名稱 | 風格特點 | 適用場景 | 視覺特征示例 |
---|---|---|---|
default | Matplotlib 默認風格,簡潔中性,線條清晰,背景為白色,無網格線默認顯示 | 通用場景,快速繪圖、臨時可視化 | 線條顏色鮮明,文本大小適中,適合大多數基礎數據展示 |
Solarize_Light2 | 淺色背景(淺黃偏白),高對比度線條,模仿紙質打印效果,視覺柔和 | 演示文稿、網頁嵌入,需要減少視覺疲勞的場景 | 背景溫暖柔和,線條顏色飽和,網格線淺灰不突兀 |
fivethirtyeight | 模仿 538 新聞網站風格,灰色背景+深色網格線,標題突出,數據標簽清晰 | 數據新聞、趨勢分析,強調故事性的可視化 | 大字體標題,帶透明度的填充色,網格線明顯但不搶眼 |
ggplot | 模仿 R 語言 ggplot2 風格,灰色網格線+白色背景,線條平滑,風格現代簡約 | 學術報告、統計分析,習慣 ggplot2 風格的用戶 | 網格線貫穿整個圖表,坐標軸邊框較細,數據系列顏色協調 |
dark_background | 深色背景(近黑色),亮色線條和文本,突出數據本身 | 強調數據對比、投影展示,或需要暗色主題的場景 | 背景深色,線條多為亮黃、亮藍等對比色,適合突出高值區域或密集數據 |
seaborn-v0_8-whitegrid | 白色背景+淺灰網格線,線條纖細,風格清爽,數據系列顏色柔和 | 多數據系列對比、趨勢圖,需要網格輔助讀數的場景 | 網格線清晰但不刺眼,適合展示連續數據的細微變化 |
seaborn-v0_8-darkgrid | 深灰背景+白色網格線,對比度適中,數據系列區分度高 | 分類數據對比、散點圖,需要減少背景干擾的場景 | 背景沉穩,網格線突出,適合多組數據并行展示 |
seaborn-v0_8-paper | 小尺寸布局,緊湊風格,適合印刷,字體和線條比例適配論文頁面 | 學術論文、期刊投稿,需要嚴格控制圖表尺寸的場景 | 元素緊湊,字體適中,節省頁面空間 |
seaborn-v0_8-poster | 大尺寸布局,粗線條+大字體,視覺沖擊力強 | 海報展示、投影匯報,需要遠距離觀看的場景 | 元素放大,線條加粗,適合突出核心數據趨勢 |
grayscale | 全灰度配色,無彩色,僅通過明暗區分數據系列 | 黑白印刷、色盲友好場景,或需要弱化顏色干擾的分析 | 用灰度梯度替代彩色,避免顏色依賴,適合嚴謹的學術印刷 |
tableau-colorblind10 | 基于 Tableau 的色盲友好配色,10 種高對比度顏色,無紅綠混淆 | 需考慮色盲受眾的場景(如公開報告、通用數據展示) | 顏色區分度高,對紅綠色盲友好,適合多分類數據 |
3. 使用主題樣式
Matplotlib 提供兩種主要方法應用主題樣式:style.use()
全局應用和 style.context()
臨時應用。
3.1 全局應用:style.use()方法
該方法會永久修改當前會話的默認樣式,所有后續圖表都會遵循指定主題,直至重新應用其他主題或重啟環境。
方法語法 | 作用描述 | 參數說明 |
---|---|---|
ms.use(style_name) | 應用單個主題 | style_name :主題名稱(字符串),如 'seaborn-v0_8-whitegrid' |
ms.use([style1, style2]) | 應用多個主題(后一個主題覆蓋前一個沖突參數) | 列表中的主題按順序生效,適合組合自定義樣式與內置主題 |
3.2 臨時應用:style.context()方法
該方法通過上下文管理器臨時應用主題,僅在 with
代碼塊內生效,退出后自動恢復原有樣式,適合局部圖表的風格調整。
方法語法 | 作用描述 | 參數說明 |
---|---|---|
with ms.context(style_name): | 臨時應用單個主題 | style_name :主題名稱,如 'ggplot' |
with ms.context([style1, style2]): | 臨時應用多個主題(后覆蓋前) | 列表中的主題按順序生效,如 ['seaborn-v0_8-paper', 'grayscale'] |
with ms.context(style, after_reset=True): | 先重置默認樣式,再應用主題 | after_reset=True :確保主題不受之前配置影響(默認 False ) |
3.3 示例:繪制分區柱形圖
繪制分區柱形圖,并設置主題風格為Solarize_Light2。
# 導入 matplotlib.pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt
# 導入 matplotlib.style 模塊,用于設置圖表樣式
import matplotlib.style as ms
# 導入 numpy 模塊,用于數值計算,這里主要用于生成數組
import numpy as np# 設置圖表樣式
ms.use('Solarize_Light2')# 使用 numpy 創建一個數組,表示柱狀圖中每個柱子在 x 軸上的位置
x = np.array([0, 1, 2, 3, 4])# 定義 x 軸上實際顯示的刻度標簽(對應每個柱子)
tick_label = ['a', 'b', 'c', 'd', 'e']# 定義第一組數據的高度(y 軸數值),代表第一個柱狀圖的數據集
height = [3, 5, 2, 8, 6]
# 定義第二組數據的高度(y 軸數值),代表第二個柱狀圖的數據集
height2 = [5, 7, 3, 9, 8]# 設置柱子的寬度
width = 0.3
# 繪制第一組柱狀圖:
# - x: 每個柱子在 x 軸上的位置(基于之前定義的數組)
# - height: 第一組柱子的高度
# - tick_label: 替換 x 軸上默認的標簽為自定義的標簽
# - width: 設置柱子的寬度
plt.bar(x=x, height=height, tick_label=tick_label, width=width)# 繪制第二組柱狀圖:
# - x + width: 將第二組柱子的位置相對于第一組向右移動一定寬度,以避免重疊
# - height2: 第二組柱子的高度
# - width: 設置柱子的寬度
plt.bar(x=x + width, height=height2, width=width)# 顯示繪制完成的圖表
plt.show()
繪制的圖形如下圖所示:
七、填充區域
1. 填充區域介紹
填充區域是數據可視化中突出數據范圍、差異或分布的重要手段,通過填充線條與坐標軸、線條與線條之間的區域,可直觀展示數據的波動范圍、置信區間、累積分布等信息,增強圖表的信息密度和可讀性。
填充區域指在圖表中,對指定邊界(如曲線與坐標軸、兩條曲線之間)所圍合的區域進行顏色或圖案填充的操作。其核心作用包括:
- 展示數據的范圍或波動(如時序數據的誤差范圍、置信區間);
- 強調累積分布(如面積圖展示占比變化);
- 突出差異對比(如兩條曲線間的差值填充)。
在 Matplotlib 中,填充區域主要通過 fill()
、fill_between()
、fill_betweenx()
三類方法實現,分別適用于不同的邊界條件(多邊形填充、x 軸方向填充、y 軸方向填充 )。
2. 使用填充區域
2.1 使用 fill() 填充
fill()
方法用于填充多邊形區域,通過傳入頂點坐標(x、y 數組),自動閉合多邊形并填充顏色。適合繪制自定義多邊形、不規則數據分布的填充(如地理邊界、任意多邊形區域)。
fill()方法參數說明:
參數名 | 作用描述 | 示例值 | 補充說明 |
---|---|---|---|
x | 多邊形頂點的 x 坐標數組 | [0, 2, 4] | 長度需與 y 一致,按順序連接頂點形成閉合區域 |
y | 多邊形頂點的 y 坐標數組 | [1, 3, 2] | 與 x 一一對應,共同定義多邊形形狀 |
color | 填充顏色 | 'skyblue' 、'#FF0000' | 支持顏色名稱、十六進制、RGB 元組等 |
alpha | 填充透明度 | 0.3 、0.7 | 范圍 [0, 1] ,值越小越透明 |
edgecolor | 多邊形邊緣顏色 | 'black' 、'none' | 'none' 表示隱藏邊緣 |
linewidth | 邊緣線條寬度 | 1.5 、0 | 0 表示無邊線(與 edgecolor='none' 效果一致) |
linestyle | 邊緣線條樣式 | '--' 、'-.' | 同線型設置(如 '-' 實線、':' 點線) |
label | 填充區域的圖例標簽 | '填充區域' | 需配合 plt.legend() 顯示圖例 |
示例:繪制多邊形
繪制多邊形,并填充顏色。
import matplotlib.pyplot as plt # 導入 matplotlib 的 pyplot 模塊,用于繪制圖形# 設置繪圖時使用的字體為 SimHei(黑體),解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常顯示負號(-),因為默認情況下使用某些中文字體可能無法正常顯示負號
plt.rcParams['axes.unicode_minus'] = False# 多邊形頂點 x 坐標列表
x = [0, 2, 4, 3]
# 多邊形頂點 y 坐標列表
y = [1, 3, 2, 0]# 使用 fill() 方法填充多邊形區域
plt.fill(x, y, # 指定多邊形各頂點的坐標facecolor='lightgreen', # 填充顏色為淺綠色alpha=0.5, # 透明度設置為 0.5,值在 0 至 1 之間,0 為完全透明,1 為不透明edgecolor='green', # 邊緣線條顏色設為綠色linewidth=2, # 邊緣線條寬度設為 2linestyle='--', # 邊緣線條樣式設為虛線label='多邊形填充' # 圖例標簽名
)# 設置 x 軸的數值范圍
plt.xlim(-1, 5)
# 設置 y 軸的數值范圍
plt.ylim(-1, 4)# 添加圖例,展示圖表中的標記信息
plt.legend()# 設置圖表標題
plt.title('fill() 填充多邊形示例')# 顯示繪制出的圖表
plt.show()
繪制的圖形如下圖所示:
2.2 使用 fill_between() 填充
fill_between()
方法用于填充兩條曲線在 x 軸方向的區域(即固定 x 范圍,填充 y 的上下邊界之間的區域),是時序數據、波動范圍可視化的核心工具(如展示溫度的最高-最低區間)。
fill_between()方法參數說明:
參數名 | 作用描述 | 示例值 | 補充說明 |
---|---|---|---|
x | 公共的 x 坐標數組(需為一維數組) | np.linspace(0, 10, 100) | 定義填充區域的 x 范圍 |
y1 | 上邊界的 y 坐標數組 | np.sin(x) | 與 x 長度一致,定義填充區域的上沿 |
y2 | 下邊界的 y 坐標數組 | np.cos(x) 、0 | 默認為 0 (即填充到 x 軸),可指定另一曲線作為下邊界 |
where | 條件填充的布爾數組 | y1 > y2 | 僅填充滿足 where 條件的區域(需與 x 長度一致) |
interpolate | 是否在交點處插值 | True 、False | 當 y1 和 y2 交叉時,True 可避免填充區域斷裂 |
color | 填充顏色 | 'orange' | 同 fill() 方法 |
alpha | 填充透明度 | 0.4 | 同 fill() 方法 |
edgecolor | 填充區域邊緣顏色 | 'red' | 同 fill() 方法 |
label | 圖例標簽 | '波動區間' | 需配合 plt.legend() 顯示 |
step | 填充邊界是否按階梯式繪制 | 'pre' 、'post' 、None | 'pre' :在 y 點處提前階梯跳躍;'post' :在 y 點處滯后階梯跳躍;None (默認):線性連接邊界 |
示例:繪制單條折線圖
繪制單條折線圖,并填充水平區域。
# 導入 matplotlib 的 pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt
import numpy as np# 設置繪圖中使用的字體為 SimHei(黑體),以支持中文顯示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 注意:這里重復設置了一次,實際只需設置一次即可
plt.rcParams['font.sans-serif'] = ['SimHei'] # ← 這行是重復的,可刪除# 定義 x 軸數據:表示年份從 2010 到 2019
x = np.array([2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019])# 定義 y 軸數據:表示對應年份的某個指標數值(如銷售額、用戶數等)
y = np.array([10, 15, 18, 25, 30, 50, 65, 70, 80, 95])# 在 x 軸和 y 軸之間的區域進行填充
plt.fill_between(x=x, # 填充區域的橫坐標y1=y, # 填充區域的上邊界(y 值)color='lightblue', # 填充顏色為淺藍色alpha=0.8, # 透明度,0 表示完全透明,1 表示完全不透明edgecolor='black', # 填充區域邊緣的顏色(邊框線顏色)label='填充區域', # 圖例標簽,用于后續顯示圖例where=(x >= 2010) & (x <= 2019), # 指定填充的條件范圍:只在年份 2010 到 2019 之間填充step='pre' # 使用“階梯圖”模式填充,'pre' 表示在每個 x 值之前發生跳變
)# 使用 plot 函數繪制折線圖,連接數據點形成趨勢線
plt.plot(x, y)# 顯示繪制好的圖形窗口
plt.show()
繪制的圖形如下圖所示:
2.3 使用 fill_betweenx() 填充
fill_betweenx()
方法用于填充兩條曲線在 y 軸方向的區域(即固定 y 范圍,填充 x 的左右邊界之間的區域),適合展示 y 軸主導的分布(如人口年齡分布的累積區間)。
fill_betweenx()方法參數說明:
參數名 | 作用描述 | 示例值 | 補充說明 |
---|---|---|---|
y | 公共的 y 坐標數組(需為一維數組) | np.linspace(0, 5, 50) | 定義填充區域的 y 范圍 |
x1 | 右邊界的 x 坐標數組 | np.exp(y/2) | 與 y 長度一致,定義填充區域的右沿 |
x2 | 左邊界的 x 坐標數組 | np.log(y+1) 、0 | 默認為 0 (即填充到 y 軸),可指定另一曲線作為左邊界 |
where | 條件填充的布爾數組 | x1 > x2 | 僅填充滿足 where 條件的區域(需與 y 長度一致) |
interpolate | 是否在交點處插值 | True 、False | 當 x1 和 x2 交叉時,True 可避免填充區域斷裂 |
color | 填充顏色 | 'cyan' | 同 fill() 方法 |
alpha | 填充透明度 | 0.5 | 同 fill() 方法 |
edgecolor | 填充區域邊緣顏色 | 'black' | 同 fill() 方法 |
label | 圖例標簽 | 'Y 軸方向填充' | 需配合 plt.legend() 顯示 |
step | 填充邊界是否按階梯式繪制 | 'pre' 、'post' 、None | 'pre' :在 y 點處提前階梯跳躍;'post' :在 y 點處滯后階梯跳躍;None (默認):線性連接邊界 |
示例:產品評分與價格區間的關系
# 導入必要模塊
import matplotlib.pyplot as plt
import numpy as np# 設置中文字體,確保中文正常顯示
plt.rcParams['font.sans-serif'] = ['SimHei']# 定義y軸數據:產品評分(1-5分)
y = np.array([1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0])# 定義x軸數據:對應評分的價格區間(左邊界和右邊界)
x_low = np.array([50, 80, 120, 180, 250, 320, 400, 500, 600]) # 最低價格
x_high = np.array([100, 150, 200, 280, 380, 480, 580, 700, 900]) # 最高價格# 使用fill_betweenx()填充y軸方向的價格區間
plt.fill_betweenx(y=y, # 縱坐標為產品評分x1=x_low, # 左邊界:最低價格x2=x_high, # 右邊界:最高價格color='lightcoral', # 填充顏色為淺珊瑚色alpha=0.6, # 透明度設置為0.6edgecolor='maroon', # 邊緣線顏色為褐紅色linewidth=1.2, # 邊緣線寬度label='價格區間', # 圖例標簽
)# 繪制價格區間的上下邊界線
plt.plot(x_low, y, color='maroon', linestyle='--', label='最低價格')
plt.plot(x_high, y, color='maroon', linestyle='-', label='最高價格')# 添加標題和坐標軸標簽
plt.title('產品評分與價格區間的關系')
plt.xlabel('價格(元)')
plt.ylabel('產品評分(1-5分)')# 顯示圖例和網格
plt.legend()# 展示圖形
plt.show()
繪制的圖形如下圖所示: