網站首頁 編程語言 正文
本文實例為大家分享了Python實現漸變色水平堆疊圖的具體代碼,供大家參考,具體內容如下
關鍵詞:python、matplotlib、barh、堆疊
起源:做數據處理時候需要制造一張如下的圖片:
示例圖
恰逢最近在學Python,然后就想試一下用python去實現,因為稍微接觸過matplotlib這個庫,然后就想著用它去實現
首先通過查資料,才知道這種圖的名字叫做“水平堆疊條狀圖”,然后使用Matplotlib.plot.barh()就可以實現水平堆疊的效果;
水平或者垂直堆疊的效果,網上有挺多教程的了,這里就不再進行描述,主要是為了記錄一下怎么去實現漸變色
一開始找資料,并沒有找到這種堆疊圖的漸變色怎么做出來
如果有大哥找到了簡便方法,還請告知一下!然后就嘗試著自己去寫一些語句去實現;現在就將研究的流程做個記錄
首先是繪圖函數的認識
barh函數的參數很多,但是我們只關注幾個參數:
X表示是上圖中的 E1 E2 E3這樣的坐標(可以理解為刻度值吧)
width表示的是當前堆疊部分的長度,這個值很關鍵!
left值是當前堆疊部分的起始點,這個值也很關鍵
color表示的是當前堆疊部分的顏色,遵循RGB順序,但是它范圍(0——0.1),即我們需將實際(R,G,B)值除以255再傳入
alpha表示的是當前堆疊部分的顏色透明度,即和上面的color參數一起構成了(RGBA)
label表示的是當前堆疊部分的圖形樣例,即上圖中的"label=二級指標1"那樣的圖例;該參數為空的時候不創建圖例,如果不為空就會根據傳入的字符串創建圖例,默認是不支持中文的,如果要用中文,需要加以下這兩句話在import matplotlib之后
#用來正常顯示中文
plt.rcParams['font.sans-serif']=['SimHei','Times New Roman']?
plt.rcParams['axes.unicode_minus']=False
`
然后講講怎么思考的
X的就是數軸上的顯示的刻度值(你也可以給他重命名);
width表示的是堆疊(填充)長度,left是本次填充起始點,那么我們將這兩個參數結合以下,就可以將本該一次填充完的長度,分成幾次填充,再分別給這幾次填充使用臨近的RGB值,就會呈現一種漸變的效果
# 一次填充完成
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'] # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus']=False
?? ?# 網上找到的漸變色的RGB配色方案
Color1 = np.array([131, 175, 155])
Color2 = np.array([200, 200, 169])
Color3 = np.array([249, 205, 173])
x = ["E1"]
Y1 = np.array([0.1])
Y2 = np.array([0.3])
plt.barh(x, Y1, align="center", color=Color1 / 255, alpha=1, label="ONE1")
plt.barh(x, Y2, left=Y1, color=Color2 / 255, alpha=1, label="ONE2")
plt.legend()
plt.show()
上述代碼運行以后的效果是這樣的
然后基于我們上述的分析,我們將對“ONE2”色塊運用參數:X,width,left,color進行分次填充實現漸變效果:
首先我們定義一個變量divid,這個變量將會決定了你分多少次填充
#填充次數,值越大漸變效果越好,但是計算量也會相應的增大
divid=20
其次我們將我們原來的填充量、顏色漸變差值分別分別除以divid
Y2_rate=Y2/divid
#用下一個顏色減去當前色快的顏色;這也將會解釋了我后來的完整代碼里,將會嚴格要求Color個數大于 Y 的個數?
#實際上Color和Y大多數情況下是行向量,但仍然用“個數”來表述,為了更方便理解
Color_rate=(Color3-Color2)/divid
然后我們將會將這兩個值在barh函數里進行使用
for i in range(divid):
? ? if i==int( divid /2 ): #這里是去原先整個色塊的中心RGB作為圖例色
? ? ? ? plt.barh(x,Y_rate,left=Y1+Y_rate*i,color=(Color1+i*Color_rate) / 255, alpha=1.0,label='ONE2')
? ? else:
? ? ? ? plt.barh(x,Y_rate,left=Y1+Y_rate*i,color=(Color1+i*Color_rate) / 255, alpha=1.0)
運行之后的效果為
而為了說明divid在這里影響漸變效果我們將分辨用幾個遞增的divid值來進行演示
divid=2時候,出現了明顯的分界線
divid=8時候,分界線被淡化了,但還是隱約可見
divid=50的時候,幾乎看不到分界線了
以上效果僅僅是基于一個X 一個Y的色快漸變進行演示,是為了更好地演示方法和思路;但是實際應用中,X,Y都將會是較長的行向量,因此,需要斟酌一下divid的選擇;
原文鏈接:https://blog.csdn.net/weixin_40515869/article/details/105591853
相關推薦
- 2022-08-27 C#使用HttpHelper框架重啟路由器_C#教程
- 2022-07-18 spring boot 中解決 Invalid character found in the req
- 2022-10-06 react-router-dom入門使用教程(路由的模糊匹配與嚴格匹配)_React
- 2023-07-31 解決el-tree數據回顯時子節點部分選中,父節點都全選中的坑
- 2023-01-11 Android網絡訪問之Retrofit使用教程_Android
- 2022-09-08 Docker容器使用方法詳解_docker
- 2022-07-09 Python?如何查看程序內存占用情況_python
- 2022-12-28 C++關鍵字const使用方法詳解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支