一文教你使用Python繪制絲滑的K線圖
前段時(shí)間寫(xiě)了一篇用 pyecharts 繪制 K 線圖的文章,結(jié)果朋友們一個(gè)個(gè)跑來(lái)留言——
“花姐,這個(gè)圖咋不全屏?”
“成交量縮放有問(wèn)題,咋整?”
“有沒(méi)有更方便的封裝方式?我想一行代碼就搞定!”
好嘛,大家的愿望就是我改進(jìn)的動(dòng)力!這不,花姐連夜優(yōu)化了一版,并且封裝成一個(gè)類,只要傳入符合格式的 DataFrame 數(shù)據(jù),一行代碼搞定絲滑的 K 線圖,完美支持全屏+縮放!
準(zhǔn)備好?先看看效果,然后咱們開(kāi)整!

優(yōu)化后的 K 線圖,支持:
? 全屏展示(再也不用擔(dān)心小圖看不清)
? 成交量縮放(精準(zhǔn)掌握市場(chǎng)動(dòng)向)
? 更絲滑的交互體驗(yàn)
這是StockKlineChart.py文件內(nèi)容,繪制K線圖的類,拿來(lái)就能用
import pandas as pd
from pyecharts.charts import Kline, Line, Bar, Grid
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
class StockKlineChart:
def __init__(self, df: pd.DataFrame, stock_code: str):
"""
初始化 K 線圖表對(duì)象
:param df: 股票數(shù)據(jù) DataFrame(包含“日期”,“開(kāi)盤(pán)”,“收盤(pán)”,“最低”,“最高”,“成交量”)
:param stock_code: 股票代碼
"""
self.df = df.sort_values("日期") # 按日期排序,確保數(shù)據(jù)按時(shí)間順序排列
self.stock_code = stock_code # 股票代碼
self.color_up = "#ef232a" # 陽(yáng)線(上漲)顏色
self.color_down = "#14b143" # 陰線(下跌)顏色
self.ma_periods = [5, 10, 20] # 移動(dòng)平均線周期
self.ma_colors = {5: "#FF0000", 10: "#0000FF", 20: "#00FF00"} # 均線顏色
def _prepare_data(self):
""" 處理數(shù)據(jù):提取 K 線數(shù)據(jù)、計(jì)算移動(dòng)均線、設(shè)置成交量顏色 """
self.dates = self.df['日期'].tolist() # 提取日期列表
self.kline_data = self.df[["開(kāi)盤(pán)", "收盤(pán)", "最低", "最高"]].values.tolist() # 提取 K 線數(shù)據(jù)
# 計(jì)算移動(dòng)平均線
for period in self.ma_periods:
self.df[f'MA{period}'] = (
self.df['收盤(pán)']
.rolling(window=period)
.mean()
.bfill() # 處理 NaN 值(前向填充)
.round(2) # 保留兩位小數(shù)
)
# 計(jì)算成交量顏色標(biāo)記(1: 上漲, -1: 下跌)
self.df['color'] = self.df.apply(
lambda x: 1 if x['收盤(pán)'] >= x['開(kāi)盤(pán)'] else -1,
axis=1
)
self.df['index_vol'] = range(len(self.df)) # 給成交量數(shù)據(jù)添加索引
def create_chart(self):
""" 生成 K 線圖表 """
self._prepare_data() # 處理數(shù)據(jù)
# ================== K 線圖配置 ==================
kline = (
Kline()
.add_xaxis(self.dates) # 設(shè)置 X 軸日期
.add_yaxis(
series_name="K線", # K 線名稱
y_axis=self.kline_data, # K 線數(shù)據(jù)(開(kāi)盤(pán)、收盤(pán)、最低、最高)
itemstyle_opts=opts.ItemStyleOpts(
color=self.color_up, # 陽(yáng)線顏色
color0=self.color_down # 陰線顏色
)
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="股票K線走勢(shì)圖", # 圖表標(biāo)題
subtitle=f"股票代碼:{self.stock_code}", # 副標(biāo)題
pos_left="left" # 標(biāo)題位置
),
legend_opts=opts.LegendOpts(
is_show=True, # 是否顯示圖例
pos_top=10, # 圖例位置(頂部)
pos_left="center" # 居中對(duì)齊
),
xaxis_opts=opts.AxisOpts(
type_="category", # X 軸類型(類別)
axislabel_opts=opts.LabelOpts(rotate=0), # X 軸標(biāo)簽角度
splitline_opts=opts.SplitLineOpts(is_show=True) # 是否顯示網(wǎng)格線
),
yaxis_opts=opts.AxisOpts(
is_scale=True, # Y 軸是否自適應(yīng)縮放
splitarea_opts=opts.SplitAreaOpts(
is_show=True, # 是否顯示網(wǎng)格背景
areastyle_opts=opts.AreaStyleOpts(opacity=1) # 設(shè)置透明度
)
),
tooltip_opts=opts.TooltipOpts(
trigger="axis", # 觸發(fā)方式:鼠標(biāo)懸浮時(shí)顯示
axis_pointer_type="cross", # 坐標(biāo)軸指示器類型(十字指示)
),
datazoom_opts=[
opts.DataZoomOpts(
is_show=False, # 是否顯示數(shù)據(jù)縮放控件
type_="inside", # 縮放類型:內(nèi)部滑動(dòng)
xaxis_index=[0, 1], # 作用于 X 軸
range_start=80, # 初始顯示范圍
range_end=100
),
opts.DataZoomOpts(
is_show=True, # 顯示滑動(dòng)條縮放
xaxis_index=[0, 1],
type_="slider",
pos_top="100%", # 位置:底部
range_start=80,
range_end=100
)
],
# 坐標(biāo)軸指示器
axispointer_opts=opts.AxisPointerOpts(
is_show=True,
link=[{"xAxisIndex": "all"}],
label=opts.LabelOpts(background_color="#777")
)
)
)
# ================== 移動(dòng)平均線配置 ==================
line = Line().add_xaxis(self.dates)
for period in self.ma_periods:
line.add_yaxis(
series_name=f"MA{period}",
y_axis=self.df[f'MA{period}'].tolist(),
is_smooth=True, # 平滑曲線
symbol="none", # 取消數(shù)據(jù)點(diǎn)標(biāo)記
linestyle_opts=opts.LineStyleOpts(
color=self.ma_colors[period], # 顏色
width=2 # 線寬
),
label_opts=opts.LabelOpts(is_show=False) # 隱藏?cái)?shù)據(jù)標(biāo)簽
)
# 疊加 K 線和均線
overlap_kline = kline.overlap(line)
# ================== 成交量柱狀圖 ==================
vol_bar = (
Bar()
.add_xaxis(self.dates)
.add_yaxis(
series_name="成交量",
y_axis=self.df[['index_vol', '成交量', 'color']].values.tolist(),
label_opts=opts.LabelOpts(is_show=False), # 隱藏標(biāo)簽
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(
type_="category",
grid_index=1,
axislabel_opts=opts.LabelOpts(is_show=False),
axistick_opts=opts.AxisTickOpts(is_show=False),
splitline_opts=opts.SplitLineOpts(is_show=False)
),
yaxis_opts=opts.AxisOpts(is_show=False),
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(
is_show=False,
dimension=2, # 顏色映射使用的維度(color)
series_index=4, # 作用于第 5 個(gè)系列(成交量)
is_piecewise=True, # 分段顯示
pieces=[
{"value": 1, "color": self.color_up}, # 上漲顏色
{"value": -1, "color": self.color_down} # 下跌顏色
]
)
)
)
# ================== 組合圖表 ==================
grid = (
Grid(init_opts=opts.InitOpts(
width="98vw",
height="95vh",
animation_opts=opts.AnimationOpts(animation=False) # 關(guān)閉動(dòng)畫(huà)
))
.add(overlap_kline, grid_opts=opts.GridOpts(pos_top="10%", height="60%" ,pos_left="30px",pos_right="10px"))
.add(vol_bar, grid_opts=opts.GridOpts(pos_top="73%", height="20%" ,pos_left="30px",pos_right="10px"))
)
return grid
def render(self, file_path: str = "stock_kline.html"):
""" 渲染并保存 K 線圖 """
chart = self.create_chart()
chart.render(file_path)
print(f"K 線圖已保存為 {file_path}")這是如何調(diào)用的方法在StockKlineChart.py所在目錄下新建一個(gè)main.py文件
import akshare as ak
import StockKlineChart as skc
# 獲取股票數(shù)據(jù)
df = ak.stock_zh_a_hist(
symbol="000001", # 股票代碼
period="daily", # 日線數(shù)據(jù)
start_date="20230101", # 起始日期
end_date="20251201", # 結(jié)束日期
adjust="qfq" # 前復(fù)權(quán)處理
)
# 創(chuàng)建 K 線圖實(shí)例
stock_chart = skc.StockKlineChart(df=df, stock_code="000001")
stock_chart.render()
運(yùn)行成功以后會(huì)在目錄下生成一個(gè)stock_kline.html文件,用谷歌瀏覽器打開(kāi)就能看到了。
結(jié)語(yǔ)
好了,文章基本上就寫(xiě)到這里了,對(duì)于Pyecharts配置有疑問(wèn)的可以參考下這張圖:

如果你也在用 pyecharts 做可視化,希望這篇文章能幫你少走點(diǎn)彎路!
到此這篇關(guān)于一文教你使用Python繪制絲滑的K線圖的文章就介紹到這了,更多相關(guān)Python繪制K線圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python爬蟲(chóng)指南之xpath實(shí)例解析(附實(shí)戰(zhàn))
在進(jìn)行網(wǎng)頁(yè)抓取的時(shí)候,分析定位html節(jié)點(diǎn)是獲取抓取信息的關(guān)鍵,目前我用的是lxml模塊,下面這篇文章主要給大家介紹了關(guān)于python爬蟲(chóng)指南之xpath實(shí)例解析的相關(guān)資料,需要的朋友可以參考下2022-01-01
Python中join()函數(shù)多種操作代碼實(shí)例
這篇文章主要介紹了Python中join()函數(shù)多種操作代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
python?pycharm中使用opencv時(shí)沒(méi)有代碼自動(dòng)補(bǔ)全提示的解決方案
我們?cè)谑褂胮ycharm的時(shí)候總是很喜歡其強(qiáng)大的代碼提示功能,下面這篇文章主要給大家介紹了關(guān)于python?pycharm中使用opencv時(shí)沒(méi)有代碼自動(dòng)補(bǔ)全提示的解決方案,需要的朋友可以參考下2022-09-09
python中in在list和dict中查找效率的對(duì)比分析
今天小編就為大家分享一篇python中in在list和dict中查找效率的對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
python利用拉鏈法實(shí)現(xiàn)字典方法示例
這篇文章主要介紹了python利用拉鏈法實(shí)現(xiàn)字典的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友可以們下面來(lái)一起看看吧。2017-03-03

