七贝PS网

 找回密码
立即注册
快捷导航
七贝PS网 首页 PS抠图教程 查看内容

他有有有有有有有有有有

发布者: 七贝PS网

来看看如何使用Python实现丝滑绘制K线图吧

前段时间写了一篇用 pyecharts 绘制 K 线图的文章,结果朋友们一个个跑来留言——

花姐,这个图咋不全屏?

成交量缩放有问题,咋整?

有没有更方便的封装方式?我想一行代码就搞定!

好嘛,大家的愿望就是我改进的动力!这不,花姐连夜优化了一版,并且封装成一个类,只要传入符合格式的 DataFrame 数据,一行代码搞定丝滑的 K 线图,完美支持全屏+缩放!

准备好?先看看效果,然后咱们开整!

 

优化后的 K 线图,支持:

✅ 全屏展示(再也不用担心小图看不清)

✅ 成交量缩放(精准掌握市场动向)

✅ 更丝滑的交互体验

这是StockKlineChart.py文件内容,绘制K线图的类,拿来就能用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

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 线图表对象

 

        :param df: 股票数据 DataFrame(包含日期开盘收盘最低最高成交量

        :param stock_code: 股票代码

        """

        self.df = df.sort_values("日期")  # 按日期排序,确保数据按时间顺序排列

        self.stock_code = stock_code  # 股票代码

        self.color_up = "#ef232a"  # 阳线(上涨)颜色

        self.color_down = "#14b143"  # 阴线(下跌)颜色

        self.ma_periods = [5, 10, 20]  # 移动平均线周期

        self.ma_colors = {5: "#FF0000", 10: "#0000FF", 20: "#00FF00"}  # 均线颜色

 

    def _prepare_data(self):

        """ 处理数据:提取 K 线数据、计算移动均线、设置成交量颜色 """

        self.dates = self.df['日期'].tolist()  # 提取日期列表

        self.kline_data = self.df[["开盘", "收盘", "最低", "最高"]].values.tolist()  # 提取 K 线数据

 

        # 计算移动平均线

        for period in self.ma_periods:

            self.df[f'MA{period}'] = (

                self.df['收盘']

                .rolling(window=period)

                .mean()

                .bfill()  # 处理 NaN 值(前向填充)

                .round(2)  # 保留两位小数

            )

 

        # 计算成交量颜色标记(1: 上涨, -1: 下跌)

        self.df['color'] = self.df.apply(

            lambda x: 1 if x['收盘'] >= x['开盘'] else -1,

            axis=1

        )

        self.df['index_vol'] = range(len(self.df))  # 给成交量数据添加索引

 

    def create_chart(self):

        """ 生成 K 线图表 """

        self._prepare_data()  # 处理数据

 

        # ================== K 线图配置 ==================

        kline = (

            Kline()

            .add_xaxis(self.dates)  # 设置 X 轴日期

            .add_yaxis(

                series_name="K线",  # K 线名称

                y_axis=self.kline_data,  # K 线数据(开盘、收盘、最低、最高)

                itemstyle_opts=opts.ItemStyleOpts(

                    color=self.color_up,  # 阳线颜色

                    color0=self.color_down  # 阴线颜色

                )

            )

            .set_global_opts(

                title_opts=opts.TitleOpts(

                    title="股票K线走势图",  # 图表标题

                    subtitle=f"股票代码:{self.stock_code}",  # 副标题

                    pos_left="left"  # 标题位置

                ),

                legend_opts=opts.LegendOpts(

                    is_show=True,  # 是否显示图例

                    pos_top=10,  # 图例位置(顶部)

                    pos_left="center"  # 居中对齐

                ),

                xaxis_opts=opts.AxisOpts(

                    type_="category",  # X 轴类型(类别)

                    axislabel_opts=opts.LabelOpts(rotate=0),  # X 轴标签角度

                    splitline_opts=opts.SplitLineOpts(is_show=True)  # 是否显示网格线

                ),

                yaxis_opts=opts.AxisOpts(

                    is_scale=True,  # Y 轴是否自适应缩放

                    splitarea_opts=opts.SplitAreaOpts(

                        is_show=True,  # 是否显示网格背景

                        areastyle_opts=opts.AreaStyleOpts(opacity=1)  # 设置透明度

                    )

                ),

                tooltip_opts=opts.TooltipOpts(

                    trigger="axis",  # 触发方式:鼠标悬浮时显示

                    axis_pointer_type="cross",  # 坐标轴指示器类型(十字指示)

                ),

                datazoom_opts=[

                    opts.DataZoomOpts(

                        is_show=False,  # 是否显示数据缩放控件

                        type_="inside",  # 缩放类型:内部滑动

                        xaxis_index=[0, 1],  # 作用于 X

                        range_start=80,  # 初始显示范围

                        range_end=100

                    ),

       &nbs


路过

雷人

握手

鲜花

鸡蛋
上一篇:水水水水水

Archiver|手机版|小黑屋|七贝PS网 ( 粤ICP备20019910号 )

GMT+8, 2025-6-19 17:31 , Processed in 0.106819 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © Tencent Cloud.