def draw(self,freq=""): kdata=[] ktime=[] kvol=[] for i in range(len(self.klines_merge)): current_kline = self.klines_merge[i] onedata=[] onedata.append(current_kline['open']) onedata.append(current_kline['close']) onedata.append(current_kline['low']) onedata.append(current_kline['high']) kdata.append(onedata) ktime.append(current_kline['date']) kvol.append(current_kline['volume']) kline=(Kline().add_xaxis(ktime) .add_yaxis(series_name= self.klines_merge[0]['code'],y_axis= kdata, markline_opts=opts.MarkLineOpts(label_opts=opts.LabelOpts(position="middle", color="blue", font_size=15), data=self.split_data_part(), symbol=["circle", "none"],), ) .set_global_opts(xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts(is_scale=True, splitarea_opts=opts.SplitAreaOpts(is_show=True,areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), datazoom_opts = [opts.DataZoomOpts()], title_opts=opts.TitleOpts(title=self.klines_merge[0]['code']) , ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True, data=self.split_data_part()) ) ) bar = (Bar().add_xaxis(ktime).add_yaxis("",kvol)) path =self.klines_merge[0]['code']+"-"+freq+".html"; kline.render(path)
def candle(self, data, label="", xaxis=None, zoom_setting=[], position=0, show_rgb=False, mark_point=[], mark_line=[]): zoomopt = [] for setting in zoom_setting: zoomopt.append( opts.DataZoomOpts(**setting) ) if not xaxis: xaxis = self.xaxis rgb_color = { "itemstyle_opts": opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), } if not show_rgb: rgb_color = {} mark_point_item = [] for point in mark_point: mark_point_item.append( opts.MarkPointItem(**point), ) return (Kline(init_opts=opts.InitOpts(**self.chart_opt)) .add_xaxis(xaxis_data=xaxis) .add_yaxis( series_name=label, y_axis=data, markpoint_opts=opts.MarkPointOpts(data=mark_point_item), markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts( position="middle", color="blue", font_size=15 ), data=mark_line, symbol=["circle", "none"], ), **rgb_color ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True, data=[]) ) .set_global_opts( title_opts=opts.TitleOpts(title="Candle Chart", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", grid_index=position, is_scale=True, boundary_gap=False, axislabel_opts=opts.LabelOpts(is_show=True), ), yaxis_opts=opts.AxisOpts( is_scale=True, 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=zoomopt, ) )
def line_with_mark_area(): line = Line( init_opts=opts.InitOpts(theme='light', width='1000px', height='600px')) line.add_xaxis(x_data) line.add_yaxis('', y_data) line.set_series_opts(markarea_opts=opts.MarkAreaOpts( data=[opts.MarkAreaItem(name="黄金周", x=("2020/10/1", "2020/10/8"))])) return line
def kline(self, data, title="K线图", open="open", close="close", high="high", low="low", date=None, blist=None, slist=None, positlist=None): if type(data) != pd.DataFrame: return None if data.empty: return None if date == None: xaxis = pd.Series( data.index).apply(lambda x: x.strftime("%Y-%m-%d")).to_list() else: xaxis = pd.Series(data["date"]).apply( lambda x: x.strftime("%Y-%m-%d")).to_list() yaxis = data[[open, close, high, low]].values.tolist() chart = Kline(init_opts=opts.InitOpts()) chart.add_xaxis(xaxis) chart.add_yaxis( "kline", yaxis, itemstyle_opts=opts.ItemStyleOpts( color="#ec0000", color0="#00da3c", border_color="#8A0000", border_color0="#008F28", ), markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="max", value_dim="close")]), markpoint_opts=bsopts(blist=blist, slist=slist)) chart.set_series_opts(markarea_opts=opts.MarkAreaOpts( data=positionsArea(positlist))) # chart = maline(data).overlap(chart) # chart.set_global_opts( # xaxis_opts=opts.AxisOpts(is_scale=True), # yaxis_opts=opts.AxisOpts( # is_scale=True, # splitarea_opts=opts.SplitAreaOpts( # is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) # ), # ), # # datazoom_opts=datazoom, # title_opts=opts.TitleOpts(title=title), # ) return chart
def __draw_zs_area(_ka): lines = [] scatters = [] for _zs in _ka.zs_list: x_start = _zs['start_point']['dt'] if _zs['zs_finished']:# 中枢完成 x_end = _zs['end_point']['dt'] chart_b = EffectScatter() if 'buy3' in _zs: chart_b.add_xaxis([_zs['buy3']['dt']]) chart_b.add_yaxis(series_name=_ka.freq if aggregation else "B", y_axis=[_zs['buy3']['xd']], is_selected=False, symbol="circle", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts(color="red",)) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) scatters.append(chart_b) elif 'sell3' in _zs: chart_b.add_xaxis([_zs['sell3']['dt']]) chart_b.add_yaxis(series_name=_ka.freq if aggregation else "S", y_axis=[_zs['sell3']['xd']], is_selected=False, symbol="circle", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts(color="green",)) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) scatters.append(chart_b) elif len(_zs['points'])>=5:# 中枢成立但未完成,有3笔或段以上 x_end = _zs['points'][-1]['dt'] else: # 中枢未完成,且未确定 continue ZD = _zs['ZD'] ZG = _zs['ZG'] area_data=[[ {'xAxis': x_start, 'yAxis': ZD, 'value': ZD }, {'xAxis': x_end, 'yAxis': ZG, 'value': ZG }]] line = (Line() .add_xaxis([x_start, x_end]) .add_yaxis(series_name=_ka.freq if aggregation else "ZS", y_axis=[ZD, ZG], symbol='none' """ , markpoint_opts = opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="ZG"), opts.MarkPointItem(type_="min", name="ZD"), ] ) """ , markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts( position="middle", color="blue", font_size=15, ), linestyle_opts=opts.LineStyleOpts(type_="dashed"), data=area_data, symbol=["none", "none"], ) ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(data=area_data, itemstyle_opts=opts.ItemStyleOpts(color="#dcdcdc",opacity=0.1)) )) lines.append(line) return lines, scatters
def line_with_mark_area(): line = Line(init_opts=opts.InitOpts(theme='essos', width='1600px', height='450px')) line.add_xaxis(x_data) line.add_yaxis('百天情感趋势图', y_data) # 设置标记区域 line.set_series_opts( markarea_opts=opts.MarkAreaOpts( data=[ opts.MarkAreaItem(name="情绪低落期", x=("1.20", "2.8")) ] ) ) return line
def kline(data, buy=[], sell=[], zone=[], title="K线图", height="250px"): if data.empty: return Kline(init_opts=opts.InitOpts(width="100%", height=height)) xaxis = pd.Series( data.index).apply(lambda x: x.strftime("%Y-%m-%d")).to_list() yaxis = data[["open", "close", "high", "low"]].values.tolist() chart = Kline(init_opts=opts.InitOpts(width="100%", height=height)) chart.add_xaxis(xaxis) chart.add_yaxis( "kline", yaxis, itemstyle_opts=opts.ItemStyleOpts( color="#ec0000", color0="#00da3c", border_color="#8A0000", border_color0="#008F28", ), # markline_opts=opts.MarkLineOpts( # data=[opts.MarkLineItem(type_="max", value_dim="close")] # ), markpoint_opts=opts.MarkPointOpts( data=buy.apply(buypoint, axis=1).values.tolist() + (sell.apply(sellpoint, axis=1).values.tolist())), ) chart.set_series_opts(markarea_opts=opts.MarkAreaOpts( data=zone.apply(bszone, axis=1).values.tolist())) # chart = chart.overlap(maline(data)) # chart.set_global_opts( # xaxis_opts=opts.AxisOpts(is_scale=True), # yaxis_opts=opts.AxisOpts( # is_scale=True, # splitarea_opts=opts.SplitAreaOpts( # is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) # ), # ), # datazoom_opts=[opts.DataZoomOpts( # pos_bottom="0px", # range_start= 100.00-(5000.00/len(xaxis)), # range_end= 100.00, # )], # title_opts=opts.TitleOpts(title=title), # ) return chart
def kline(data, title="K线图", height="250px"): # logging.debug(data) if data.empty: return Kline(init_opts=opts.InitOpts(width="100%", height=height)) xaxis = pd.Series( data.index).apply(lambda x: x.strftime("%Y-%m-%d")).to_list() yaxis = data[["open", "close", "high", "low"]].values.tolist() chart = Kline(init_opts=opts.InitOpts(width="100%", height=height)) chart.add_xaxis(xaxis) chart.add_yaxis( "kline", yaxis, itemstyle_opts=opts.ItemStyleOpts( color="#ec0000", color0="#00da3c", border_color="#8A0000", border_color0="#008F28", ), markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="max", value_dim="close")]), markpoint_opts=opts.MarkPointOpts( data=bspoint(data), label_opts=opts.LabelOpts( position="top", color="#000", font_size=8, ), ), ) chart.set_series_opts(markarea_opts=opts.MarkAreaOpts(data=bsArea)) chart = maline(data).overlap(chart) chart.set_global_opts( xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), datazoom_opts=datazoom, title_opts=opts.TitleOpts(title=title), ) return chart
def geoStation(self, data) -> Geo: """ -- 全国火车站及开行列车数量分布图 设置主题:theme=ThemeType.DARK,背景颜色:bg_color="#e0f0e9",设置高亮状态下的样式 :param data:list:[(车站名称,值)] :return: Geo """ station_map = ( Geo(init_opts=opts.InitOpts( width='1000px', height='500px', theme=ThemeType.DARK)).add_schema( maptype="china", zoom=1.2, itemstyle_opts=opts.ItemStyleOpts(color="#323c48", border_color="#111"), emphasis_itemstyle_opts=opts.ItemStyleOpts( color="#323c48"), # 高亮状态下的多边形样式(省份) emphasis_label_opts=opts.LabelOpts( is_show=False) # 高亮状态下的标签样式(省份名称) ).add_coordinate_json(self.file_json) # 从json文件导入坐标值 .add('', data[:2990], symbol_size=2, color='#057748').set_series_opts( label_opts=opts.LabelOpts(is_show=False), markarea_opts=opts.MarkAreaOpts( is_silent=False)) # 关闭各省名称显示 .set_global_opts( visualmap_opts=opts.VisualMapOpts(type_='color', min_=0, max_=100), title_opts=opts.TitleOpts( title='全国火车站及开行列车数量分布图', title_textstyle_opts=opts.TextStyleOpts( font_size=20), # 设置标题大小 subtitle='全国3500+个车站,开行列车最多的前三个车站是:{},{},{}... {}'.format( data[0][0], data[1][0], data[2][0], self.data_source)))) return station_map
axispointer_opts=opts.AxisPointerOpts(is_show=True) # 分隔线 splitline_opts=opts.SplitLineOpts(is_show=True), ) ) .set_series_opts( # 区域标记 markarea_opts=opts.MarkAreaOpts( is_silent=False, data=[ opts.MarkAreaItem( name='', x=(year-0.5,year+0.5), label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color="#aaaaaa", opacity=0.1 ), ) ] ) ) ) #------------------------------------- 配件及其他常用格式详解 -------------------------------------# line=( Line( # 官方说明链接 下同 # 初始化 https://pyecharts.org/#/zh-cn/global_options?id=initopts%ef%bc%9a%e5%88%9d%e5%a7%8b%e5%8c%96%e9%85%8d%e7%bd%ae%e9%a1%b9 width = "900px", height = "500px",
def positionsArea(list): # 持仓范围 return opts.MarkAreaOpts( data=list.apply(positionsitem, axis=1).values.tolist())
import datetime import math import pyecharts.options as opts import random from pyecharts.charts import * from pyecharts.components import Table from pyecharts.faker import POPULATION from pyecharts.globals import CurrentConfig CurrentConfig.ONLINE_HOST = "https://cdn.kesci.com/lib/pyecharts_assets/" # %% # 直角坐标系图表 # 直方图 x_data = ['apple', 'huawei', 'xiaomi', 'oppo', 'vivo', 'meizu'] y_data = [123, 312, 89, 107, 82, 23] bar = (Bar().add_xaxis(x_data).add_yaxis('', y_data)) bar.render() # %% # 折线图 x_data = ['apple', 'huawei', 'xiaomi', 'oppo', 'vivo', 'meizu'] y_data = [123, 312, 89, 107, 82, 23] bar = (Line().add_xaxis(x_data).add_yaxis('', y_data)) bar.render() # %% # 折线图 x_data = ['apple', 'huawei', 'xiaomi', 'oppo', 'vivo', 'meizu'] y_data = [[random.randint(100, 200) for i in range(10)] for item in x_data] Box = Boxplot() Box.add_xaxis(x_data) Box.add_yaxis('', Box.prepare_data(y_data)) bar.render()
) bar.add_xaxis(month_columns) bar.add_yaxis( '降水量', # 设置系列名。 data_precipitation, # 配置数据源。 itemstyle_opts=opts.ItemStyleOpts( # 配置图形。 color='CornFlowerBlue')) bar.add_yaxis('蒸发量', data_evaporation) bar.set_global_opts( title_opts=opts.TitleOpts( # 设置标题和副标题,或用字典形式也可。 title='条形图示例', subtitle='降水量、蒸发量显示'), datazoom_opts=opts.DataZoomOpts(is_show=True), # 设置显示滚动条。 yaxis_opts=opts.AxisOpts(max_=200), # 配置y轴最大值为200,类似方法可配置x轴。 toolbox_opts=opts.ToolboxOpts(), # 配置工具箱栏。 ) bar.set_series_opts( label_opts=opts.LabelOpts(is_show=False), # 设置在图表上显示具体数值,默认为True,此处设置为不显示。 markpoint_opts=opts.MarkAreaOpts( # 设置显示数据标记点。 data=[ opts.MarkPointItem(type_='max'), # 标记最大值点。 opts.MarkPointItem(type_='min'), # 标记最小值点。 ]), markline_opts=opts.MarkLineOpts( # 设置显示数据标记线。 data=[ opts.MarkLineItem(type_='average', name='平均') # 标记平均值线和线名称,线名称会在鼠标浮于其上时显示。 ])) bar.render('{}.html'.format(__file__))
.set_global_opts( title_opts=opts.TitleOpts(title="一天用电量分布", subtitle="纯属虚构"), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), xaxis_opts=opts.AxisOpts(boundary_gap=False), yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(formatter="{value} W"), splitline_opts=opts.SplitLineOpts(is_show=True), ), visualmap_opts=opts.VisualMapOpts( is_piecewise=True, dimension=0, pieces=[ {"lte": 6, "color": "green"}, {"gt": 6, "lte": 8, "color": "red"}, {"gt": 8, "lte": 14, "color": "green"}, {"gt": 14, "lte": 17, "color": "red"}, {"gt": 17, "color": "green"}, ], ), ) .set_series_opts( markarea_opts=opts.MarkAreaOpts( data=[ opts.MarkAreaItem(name="早高峰", x=("07:30", "10:00")), opts.MarkAreaItem(name="晚高峰", x=("17:30", "21:15")), ] ) ) .render("distribution_of_electricity.html") )
), title_opts=opts.TitleOpts(title="各时段的订单数量与销售额"), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), )) line = ( Line().add_xaxis(x_data).add_yaxis( "销售额", t3["analyze_t3.sales"].values.tolist(), yaxis_index=0, #color="#ff5798", #color="#BFEFFF", label_opts=opts.LabelOpts(is_show=False), ).set_series_opts(markarea_opts=opts.MarkAreaOpts(data=[ opts.MarkAreaItem(name="午高峰", x=("12", "15")), opts.MarkAreaItem(name="晚高峰", x=("17", "20")), ]))) # x_data = ["{}月".format(i) for i in range(1, 13)] # line = ( # Line() # .add_xaxis(x_data) # .add_yaxis( # "平均温度", # [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2], # # yaxis_index=2, # # color="#675bba", # # label_opts=opts.LabelOpts(is_show=False), # ) # )
pieces=[ { "lte": 6, "color": "green" }, { "gt": 6, "lte": 8, "color": "red" }, { "gt": 8, "lte": 14, "color": "green" }, { "gt": 14, "lte": 17, "color": "red" }, { "gt": 17, "color": "green" }, ], ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts(data=[ opts.MarkAreaItem(name="早高峰", x=("07:30", "10:00")), opts.MarkAreaItem(name="晚高峰", x=("17:30", "21:15")), ])).render("distribution_of_electricity.html"))
def draw_chart(df, extend_field, save_path="", trade_list=None, point_list=None, area_list=None, kline_title="买卖点K线图", is_smooth=True, is_connect_nones=False): datetime_array = df.datetime.tolist() volume_array = df.volume.tolist() # open close low high kline_data = df[["open", "close", "low", "high"]].values.tolist() # 绘制买卖点 _point_list = [] # 绘制标志点 if point_list is not None and len(point_list) > 1: for point in point_list: if type(point["datetime"]) == str: point_datetime = point["datetime"] else: point_datetime = point["datetime"].strftime( "%Y-%m-%d %H:%M:%S.%f") point_name = point.get("name", "") _point_list.append( opts.MarkPointItem( name=point_name, coord=[point_datetime, point["y"]], value=point_name if point_name else point["y"], itemstyle_opts=opts.ItemStyleOpts( color=point.get("color", "#ef232a")))) else: if trade_list is not None and len(trade_list) > 1: for trade in trade_list: # 开多 if type(trade[0]) == str: trade_datetime = trade[0] else: trade_datetime = trade[0].strftime( "%Y-%m-%d %H:%M:%S.%f") if trade_datetime < datetime_array[0]: continue if trade[1] == "多" and trade[4] == "开": _point_list.append( opts.MarkPointItem( name="开多", coord=[trade_datetime, trade[6]], value="开多", itemstyle_opts=opts.ItemStyleOpts( color="#ef232a"))) # 开空 elif trade[1] == "空" and trade[4] == "开": _point_list.append( opts.MarkPointItem( name="开空", coord=[trade_datetime, trade[6]], value="开空", itemstyle_opts=opts.ItemStyleOpts( color="#ef232a"))) # 平多 elif trade[1] == "多" and (trade[4] == "平" or trade[4] == "平今" or trade[4] == "平昨"): _point_list.append( opts.MarkPointItem( name="平空", coord=[trade_datetime, trade[6]], value="平空", itemstyle_opts=opts.ItemStyleOpts( color="#14b143"))) # 平空 elif trade[1] == "空" and (trade[4] == "平" or trade[4] == "平今" or trade[4] == "平昨"): _point_list.append( opts.MarkPointItem( name="平多", coord=[trade_datetime, trade[6]], value="平多", itemstyle_opts=opts.ItemStyleOpts( color="#14b143"))) # 绘制矩形 _area_list = [] if area_list is not None and len(area_list) > 1: for item in area_list: _area_list.append( opts.MarkAreaItem( x=item["x"], y=item["y"], itemstyle_opts=opts.ItemStyleOpts( color="transparent", border_color=item.get("border_color", "#4D0099"), border_width=3, border_type="dashed"), )) kline = (Kline().add_xaxis(xaxis_data=datetime_array).add_yaxis( series_name="Kline", y_axis=kline_data, itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), markpoint_opts=opts.MarkPointOpts(data=_point_list), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( data=_area_list, )).set_global_opts( title_opts=opts.TitleOpts(title=kline_title, pos_left="2%", pos_top="1%"), legend_opts=opts.LegendOpts(is_show=True, pos_top=10, pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 1], range_start=0, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], type_="slider", pos_top="88%", range_start=0, range_end=100, ), ], yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)), tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=5, is_piecewise=True, pieces=[ { "value": 1, "color": "#00da3c" }, { "value": -1, "color": "#ec0000" }, ], ), axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), )) bar = (Bar().add_xaxis(xaxis_data=datetime_array).add_yaxis( series_name="Volume", y_axis=volume_array, xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( grid_index=1, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) if len(extend_field) > 0: line = (Line().add_xaxis( xaxis_data=datetime_array).set_global_opts( xaxis_opts=opts.AxisOpts(type_="category"), legend_opts=opts.LegendOpts(is_show=True), )) for field in extend_field: field_value_array = df[field].tolist() line.add_yaxis( series_name=field, y_axis=field_value_array, is_smooth=is_smooth, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8), label_opts=opts.LabelOpts(is_show=False), is_connect_nones=is_connect_nones, ) # Kline And Line kline = kline.overlap(line) # Grid Overlap + Bar grid_chart = Grid(init_opts=opts.InitOpts( width="100%", height="760px", animation_opts=opts.AnimationOpts(animation=False), )) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="3.5%", pos_right="3.5%", height="60%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="3.5%", pos_right="3.5%", pos_top="70%", height="16%"), ) grid_chart.render(os.path.join(save_path, "KLineChart.html"))
def signal_overview(price, trades=None, supplements=None, plot_options={}, f_name="1213.html"): figs_counts = len(supplements) legends_heights = (figs_counts * 5) left = 90 - legends_heights height = left / figs_counts sub_plots = [] fig_size = plot_options.setdefault("fig_size", ("1000px", "600px")) x_data = price.index.tolist() y_data = price.values.tolist() marks = supplements.get("marks") with_marks = True if marks is not None else False if with_marks: _ = pd.Series(index=price.index, data=np.arange(len(price))) marks_data = [ opts.MarkPointItem(coord=[(x_data[int(l)]), (y_data[int(l)])], itemstyle_opts=opts.ItemStyleOpts( color=plot_options.setdefault( v[0], colors[i]), opacity=0.6), symbol_size=20, symbol="pin") for i, v in enumerate(marks.items()) for l in _.reindex(v[1]).dropna().values.tolist() ] else: marks_data = [] with_trades = True if isinstance(trades, pd.Series) else False if with_trades: e_loc = [ price.index.get_loc(i) for i in trades.index.get_level_values(0).unique() ] ex_loc = [ price.index.get_loc(i) for i in trades.index.get_level_values(1).unique() ] pairs_loc = list(zip(e_loc, ex_loc)) (pairs_loc) _b = [{"gt": p[0], "lte": p[1], "color": "#CD6839"} for p in pairs_loc] _c = [{ "gt": pairs_loc[i][-1], "lte": p[0], "color": "#4A708B" } for i, p in enumerate(pairs_loc[1:])] _a = [{ "lte": pairs_loc[0][0], "color": "#4A708B" }, { "gt": pairs_loc[-1][-1], "color": colors[0] }] pieces = _a + _b + _c else: pieces = [] ds = np.unique(price.index.date) decor_ = price.groupby( price.index.date).apply(lambda x: [x.index[0], x.index[-1]]).loc[[ l[1] for l in list(filter(lambda x: x[0] % 2 == 0, enumerate(ds))) ]] data_zoom_axis = np.arange(figs_counts).astype(int).tolist() line = (Line( init_opts=opts.InitOpts(width=fig_size[0], height=fig_size[1]) ).add_xaxis(xaxis_data=x_data).add_yaxis( series_name="价格", y_axis=y_data, yaxis_index=0, is_smooth=True, is_symbol_show=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2), markpoint_opts=opts.MarkPointOpts(data=marks_data, ), ).set_global_opts( title_opts=opts.TitleOpts(title="价格", pos_left='center', pos_top=str(figs_counts * 5) + "%"), toolbox_opts=opts.ToolboxOpts(is_show=True), tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", border_width=1, ), legend_opts=opts.LegendOpts(pos_left="left"), axispointer_opts=opts.AxisPointerOpts(is_show=True, link=[{ "xAxisIndex": "all" }]), datazoom_opts=[ opts.DataZoomOpts(is_show=True, is_realtime=True, xaxis_index=data_zoom_axis, pos_top="5%", range_start=0, range_end=100, orient="horizontal", type_="inside"), opts.DataZoomOpts(type_="slider", xaxis_index=data_zoom_axis, pos_bottom="bottom"), ], yaxis_opts=opts.AxisOpts( is_scale=True, axistick_opts=opts.AxisTickOpts(is_inside=False), axispointer_opts=opts.AxisPointerOpts(is_show=True), axisline_opts=opts.AxisLineOpts(symbol='none'), splitline_opts=opts.SplitLineOpts(is_show=True)), xaxis_opts=opts.AxisOpts(is_show=False, ), visualmap_opts=opts.VisualMapOpts( is_show=False, is_piecewise=with_trades, dimension=0, pieces=pieces, ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts(data=[ opts.MarkAreaItem( name="", x=(d[0], d[1]), itemstyle_opts=opts.ItemStyleOpts(color="#A1A9AF", opacity=0.2), ) for d in decor_ ]))) sub_plots.append(line) if with_marks: _ = supplements.pop("marks") if len(supplements) > 0: last_pic = list(supplements.keys())[-1] for i, s_1 in enumerate(supplements.items()): k, v = s_1[0], s_1[1] print(k) ls = Line( init_opts=opts.InitOpts(width=fig_size[0], height=fig_size[1])) ls = ls.add_xaxis(xaxis_data=price.index.tolist()) for j, s_2 in enumerate(v.items()): n, l = s_2[0], s_2[1] print(n) num = i * len(s_1) + j ls.add_yaxis( series_name=n, y_axis=l.tolist(), yaxis_index=len(sub_plots), linestyle_opts=opts.LineStyleOpts( width=2, color=plot_options.setdefault(n, colors[num])), label_opts=opts.LabelOpts(is_show=False), ) s = legends_heights + height * len(sub_plots) ls = ls.set_global_opts( title_opts=opts.TitleOpts(title=k, pos_left='center', pos_top=str(s) + "%"), legend_opts=opts.LegendOpts(pos_left="left", pos_top=str(len(sub_plots) * 5) + "%"), yaxis_opts=opts.AxisOpts( is_scale=True, axistick_opts=opts.AxisTickOpts(is_inside=False), axispointer_opts=opts.AxisPointerOpts(is_show=True), axisline_opts=opts.AxisLineOpts(symbol='none'), splitline_opts=opts.SplitLineOpts(is_show=True)), xaxis_opts=opts.AxisOpts(is_show=(k == last_pic), ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( data=[ opts.MarkAreaItem( name="", x=(d[0], d[1]), itemstyle_opts=opts.ItemStyleOpts(color="#A1A9AF", opacity=0.2), ) for d in decor_ ], is_silent=False, )) sub_plots.append(ls) pos = [ i + "%" for i in (height * np.arange(len(sub_plots)) + legends_heights + 4.3).astype(str) ] g = (Grid(init_opts=opts.InitOpts(width=fig_size[0], height=fig_size[1]))) for i, v in enumerate(sub_plots): g.add( chart=v, grid_opts=opts.GridOpts(pos_left=50, pos_right=50, pos_top=pos[i], height=str(height - 5) + "%"), ) g.render(f_name)
def line(delivery_dates, df): # line the vix FLINE_OPT = opts.LineStyleOpts(opacity=1, width=1.5) OLINE_OPT = opts.LineStyleOpts(opacity=0.9, width=1.2, type_='dashed') df['delivery'] = [10 + 5 * (idx in delivery_dates) for idx in df.index] warning_areas = get_warning_areas(df) # there is a bug in pyecharts, the colors are reversed # line.colors = ['crimson', 'gold', 'green', 'fuchsia', 'orchid', 'plum'] line = ( Line().add_xaxis(xaxis_data=df.index).add_yaxis( "vix", df[0], is_symbol_show=False, areastyle_opts=opts.AreaStyleOpts(opacity=0.2), linestyle_opts=FLINE_OPT, color='powderblue', markline_opts=opts.MarkLineOpts(data=[ opts.MarkLineItem(type_="min", name="ivl"), opts.MarkLineItem(type_="max", name="ivh"), ])).add_yaxis('gvz', df['gvz'], is_symbol_show=False, linestyle_opts=FLINE_OPT, color='olive', markline_opts=opts.MarkLineOpts(data=[ opts.MarkLineItem(type_="min", name="ivl"), opts.MarkLineItem(type_="max", name="ivh"), ])).add_yaxis( 'ovx', df['ovx'], is_symbol_show=False, linestyle_opts=FLINE_OPT, color='tan', # is_selected = False, markline_opts=opts.MarkLineOpts(data=[ opts.MarkLineItem(type_="min", name="ivl"), opts.MarkLineItem(type_="max", name="ivh"), ])).add_yaxis( "1", df[1], is_symbol_show=False, color='plum', linestyle_opts=OLINE_OPT).add_yaxis( "2", df[2], is_symbol_show=False, color='orchid', linestyle_opts=OLINE_OPT, is_selected=False).add_yaxis( "3", df[3], is_symbol_show=False, color='fuchsia', linestyle_opts=OLINE_OPT).add_yaxis( "4", df[4], is_symbol_show=False, color='green', linestyle_opts=OLINE_OPT, is_selected=False).add_yaxis( "5", df[5], is_symbol_show=False, color='gold', linestyle_opts=OLINE_OPT) # add delivery date mark, not a good idea, but worked. .add_yaxis("delivery", df['delivery'], is_symbol_show=False, color='crimson', is_step=True).set_series_opts( label_opts=opts.LabelOpts(is_show=False), markarea_opts=opts.MarkAreaOpts( is_silent=True, data=[ opts.MarkAreaItem(name="warn", x=(xs, xe)) for xs, xe in warning_areas ], itemstyle_opts=opts.ItemStyleOpts( color='#FFA54F10'))).set_global_opts( title_opts=opts.TitleOpts(title="vix", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts( is_on_zero=False), splitline_opts=opts.SplitLineOpts( is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts( is_show=True)), tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="line"), datazoom_opts=opts.DataZoomOpts( type_="slider", range_start=50, range_end=100), )) return line
def draw_chart(cls, data): kline = ( Kline().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="", y_axis=data["datas"], itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ]), markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts(position="middle", color="blue", font_size=15), data=cls.split_data_part(data), symbol=["circle", "none"], ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=cls.split_data_part(data))). set_global_opts( title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts(is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100), opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 3], range_end=100), ], # 三个图的 axis 连在一块 # axispointer_opts=opts.AxisPointerOpts( # is_show=True, # link=[{"xAxisIndex": "all"}], # label=opts.LabelOpts(background_color="#777"), # ), )) kline_line = ( Line().add_xaxis(xaxis_data=data["times"]) # # EMA10 # .add_yaxis( # series_name="EMA10", # y_axis=data["ema10"], # xaxis_index=2, # yaxis_index=2, # label_opts=opts.LabelOpts(is_show=False), # ) # EMA144 # .add_yaxis( # series_name="EMA144", # y_axis=data["ema144"], # xaxis_index=2, # yaxis_index=2, # label_opts=opts.LabelOpts(is_show=False), # ) # boll_median .add_yaxis( series_name="median", y_axis=data["boll_median"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) # boll_upper .add_yaxis( series_name="upper", y_axis=data["boll_upper"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) # boll_lower .add_yaxis( series_name="lower", y_axis=data["boll_lower"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=1, split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), )) # Overlap Kline + Line overlap_kline_line = kline.overlap(kline_line) # Bar-1 bar_1 = ( Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="Volumn", yaxis_data=data["vols"], xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), # 根据 echarts demo 的原版是这么写的 # itemstyle_opts=opts.ItemStyleOpts( # color=JsCode(""" # function(params) { # var colorList; # if (data.datas[params.dataIndex][1]>data.datas[params.dataIndex][0]) { # colorList = '#ef232a'; # } else { # colorList = '#14b143'; # } # return colorList; # } # """) # ) # 改进后在 grid 中 add_js_funcs 后变成如下 itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) # Bar-2 (Overlap Bar + Line) bar_2 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="MACD", yaxis_data=data["macds"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), legend_opts=opts.LegendOpts(is_show=False), )) line_2 = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="DIF", y_axis=data["difs"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DEA", y_axis=data["deas"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) rsi_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="rsi6", y_axis=data["rsi6"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="rsi12", y_axis=data["rsi12"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="rsi24", y_axis=data["rsi24"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) # MACD overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid( init_opts=opts.InitOpts(width="1400px", height="800px")) # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format(data["datas"])) # K线图和 MA5 的折线图 grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", height="45%"), ) # Volumn 柱状图 grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="56%", height="10%"), ) # MACD DIFS DEAS grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="68%", height="14%"), ) # rsi6 grid_chart.add( rsi_line, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="84%", height="10%"), ) return grid_chart.render_embed()
def draw(df, file_png="test.png"): x = df.dt.to_list() kline = ( Kline() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="", y_axis=df[['open', 'close', 'low', 'high']].values.tolist(), itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True) ) .set_global_opts( title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(is_show=True, position="inside") ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100 ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100 ), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], # 三个图的 axis 连在一块 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{"xAxisIndex": "all"}], label=opts.LabelOpts(background_color="#777"), ), ) ) kline_line = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="笔", y_axis=df.bi.tolist(), is_smooth=False, is_connect_nones=True, symbol='diamond', symbol_size=8, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='dotted', width=1.5), label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="线段", y_axis=df.xd.tolist(), is_smooth=False, is_connect_nones=True, symbol='triangle', symbol_size=12, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='solid', width=1.5), label_opts=opts.LabelOpts(is_show=True, position='right'), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=1, split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), ) ) # Overlap Kline + Line overlap_kline_line = kline.overlap(kline_line) df1 = df[df['基准价格'] > 0] c = ( Scatter() .add_xaxis(df1['出现时间'].to_list()) .add_yaxis( "买卖点", df1['基准价格'].to_list(), label_opts=opts.LabelOpts( is_show=True, position="left", formatter=JsCode( "function(params){return bsName[params.dataIndex][0];}" ) ), )) overlap_kline_line = overlap_kline_line.overlap(c) # draw volume bar_1 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="Volumn", yaxis_data=df.vol.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(is_show=True, position='inside') ), legend_opts=opts.LegendOpts(is_show=False), ) ) # Bar-2 (Overlap Bar + Line) bar_2 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="MACD", yaxis_data=df.macd.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), legend_opts=opts.LegendOpts(is_show=False), ) ) line_2 = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="DIF", y_axis=df['diff'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="DEA", y_axis=df['dea'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) ) # draw MACD overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid(init_opts=opts.InitOpts(width="1400px", height="680px")) grid_chart.add_js_funcs("var barData = {}".format(df[['open', 'close', 'low', 'high']].values.tolist())) grid_chart.add_js_funcs("var bsName = {}".format(df1[["操作提示", "基准价格"]].values.tolist())) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"), ) file_html = file_png.replace(".png", '.html') make_snapshot(snapshot, grid_chart.render(path=file_html), file_png)
def plot_kline(ka, bs=None, file_html="kline.html", width="1400px", height="680px"): """ :param ka: KlineAnalyze :param bs: pd.DataFrame 买卖点,包含三个字段 ["操作提示", "交易时间", "交易价格"] :param file_html: str :param width: str :param height: str :return: None """ df = ka.to_df(use_macd=True, ma_params=(5, 20,)) x = df.dt.to_list() title = "%s | %s 至 %s" % (ka.symbol, ka.start_dt, ka.end_dt) kline = ( Kline() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="", y_axis=df[['open', 'close', 'low', 'high']].values.tolist(), itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True) ) .set_global_opts( title_opts=opts.TitleOpts(title=title, pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(is_show=True, position="inside") ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100 ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], pos_top="96%", range_end=100 ), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], # 三个图的 axis 连在一块 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{"xAxisIndex": "all"}], label=opts.LabelOpts(background_color="#777"), ), ) ) kline_line = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="笔", y_axis=df.bi.tolist(), is_smooth=False, is_connect_nones=True, symbol='diamond', symbol_size=8, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='dotted', width=2), label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="线段", y_axis=df.xd.tolist(), is_smooth=False, is_connect_nones=True, symbol='triangle', symbol_size=12, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='solid', width=2), label_opts=opts.LabelOpts(is_show=True, position='right'), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=1, split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), ) ) # Overlap Kline + Line overlap_kline_line = kline.overlap(kline_line) if isinstance(bs, pd.DataFrame) and len(bs) > 0: c = ( Scatter() .add_xaxis(bs['交易时间'].to_list()) .add_yaxis( "买卖点", bs['交易价格'].to_list(), label_opts=opts.LabelOpts( is_show=True, position="left", formatter=JsCode( "function(params){return bsName[params.dataIndex][0];}" ) ), )) overlap_kline_line = overlap_kline_line.overlap(c) # draw volume bar_1 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="Volumn", yaxis_data=df.vol.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(is_show=True, position='inside') ), legend_opts=opts.LegendOpts(is_show=False), ) ) # Bar-2 (Overlap Bar + Line) bar_2 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="MACD", yaxis_data=df.macd.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), legend_opts=opts.LegendOpts(is_show=False), ) ) line_2 = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="DIF", y_axis=df['diff'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="DEA", y_axis=df['dea'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) ) # draw MACD overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid(init_opts=opts.InitOpts(width=width, height=height, page_title=title)) grid_chart.add_js_funcs("var barData = {}".format(df[['open', 'close', 'low', 'high']].values.tolist())) if isinstance(bs, pd.DataFrame) and len(bs) > 0: grid_chart.add_js_funcs("var bsName = {}".format(bs[["操作提示", "交易价格"]].values.tolist())) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"), ) grid_chart.render(path=file_html)
def draw_chan(stock, stock_df, kc, end_time, period): # stock_df_original = stock_df[[ 'date', 'open', 'close', 'low', 'high', 'money' ]] stock_df_bi = kc.getFenBI_df()[['date', 'chan_price']] stock_df_xd = kc.getFenDuan_df()[['date', 'chan_price']] kline = ( # Kline({"theme": ThemeType.DARK}) Kline().add_xaxis( xaxis_data=stock_df_original['date'].tolist(), ).add_yaxis( series_name=stock, y_axis=stock_df_original[['open', 'close', 'low', 'high']].tolist(), itemstyle_opts=opts.ItemStyleOpts( color="#ec0000", color0="#00da3c"), #添加用 Hex 字符串表示的红和绿两种颜色,对应着 K线涨和跌的颜色。 ).set_global_opts( title_opts=opts.TitleOpts(title="缠论", ), xaxis_opts=opts.AxisOpts(type_="category"), # 分割线 yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), legend_opts=opts.LegendOpts(is_show=True), toolbox_opts=opts.ToolboxOpts(), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", #xaxis_index=[0, 1], range_start= 0, #添加两个「数据区域缩放」功能,一个看的到(用鼠标拉缩图最下面的 slider),一个看不到(用鼠标直接在图中拉缩),并且设置 xaxis_index =[0,1],表示用 K 线图(index 0)来控制柱状图(index 1)。 range_end=100, ), opts.DataZoomOpts( is_show=True, #xaxis_index=[0, 1], type_="slider", pos_top="90%", range_start= 0, #index为1和2的两幅图的数据局部伸缩跟着index0那幅图,这样就实现了用一根x轴的slider可以任意缩放三幅图的数据 range_end=100, ), ], tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", #将两幅图的提示框合并在一起。 background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=3, is_piecewise=True, pieces=[ { "value": -1, "color": "#ec0000" }, { "value": 1, "color": "#00da3c" }, ], ), #坐标轴指示器配置和区域选择组件配置使得数据和轴可以一起联动。 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="linex", ), )) Biline = ( Line().add_xaxis(xaxis_data=stock_df_bi['date'].tolist()).add_yaxis( series_name='笔', y_axis=stock_df_bi['chan_price'].tolist(), is_smooth=False, is_connect_nones=True, is_hover_animation=False, #linestyle_opts=opts.LineStyleOpts(color="red",width=2, type_="dashed"), linestyle_opts=opts.LineStyleOpts(color="red", width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=True), ) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) overlap = kline.overlap(Biline) crp = CentralRegionProcess(kc.getFenDuan_df(), kc, isdebug=False) crp.define_central_region() stock_zs_x, stock_zs_y = crp.convert_to_graph_data() if (stock_df_xd is not None) and (len(stock_zs_x) != 0): # print('if') for i in range(0, len(stock_zs_x), 2): XD_line = ( Line().add_xaxis(xaxis_data=stock_df_xd['date'].tolist()). add_yaxis( series_name='段', y_axis=stock_df_xd['chan_price'].tolist(), is_smooth=False, is_connect_nones=True, is_hover_animation=False, #linestyle_opts=opts.LineStyleOpts(color="red",width=2, type_="dashed"), linestyle_opts=opts.LineStyleOpts(color="blue", width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=[[{ 'xAxis': stock_zs_x[i], 'yAxis': stock_zs_y[i] }, { 'xAxis': stock_zs_x[i + 1], 'yAxis': stock_zs_y[i + 1] }]])) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) elif stock_df_xd is not None: # print('elif') XD_line = ( Line().add_xaxis(xaxis_data=stock_df_xd['date'].tolist()). add_yaxis( series_name='段', y_axis=stock_df_xd['chan_price'].tolist(), is_smooth=False, is_connect_nones=True, is_hover_animation=False, #linestyle_opts=opts.LineStyleOpts(color="red",width=2, type_="dashed"), linestyle_opts=opts.LineStyleOpts(color="blue", width=2, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), )) overlap = overlap.overlap(XD_line) # MA_line = ( # Line() # .add_xaxis(xaxis_data=stock_df_original['date'].tolist(),) # .add_yaxis( # series_name="MA5", # y_axis= talib.SMA(stock_df['close'],timeperiod = 5).tolist(), # is_smooth=True, # is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), # label_opts=opts.LabelOpts(is_show=False), # ) # .add_yaxis( # series_name="MA10", # y_axis= talib.SMA(stock_df['close'],timeperiod = 10).tolist(), # is_smooth=True, # is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), # label_opts=opts.LabelOpts(is_show=False), # ) # .add_yaxis( # series_name="MA13", # y_axis= talib.SMA(stock_df['close'],timeperiod = 13).tolist(), # is_smooth=True, # is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), # label_opts=opts.LabelOpts(is_show=False), # ) # .add_yaxis( # series_name="MA34", # y_axis= talib.SMA(stock_df['close'],timeperiod = 34).tolist(), # is_smooth=True, # is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), # label_opts=opts.LabelOpts(is_show=False), # ) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) # ) # Volume_Bar = ( # Bar() # .add_xaxis(xaxis_data=stock_df_original['date'].tolist()) # .add_yaxis( # series_name="money", # yaxis_data=stock_df_original['money'].tolist(), # xaxis_index=2, # yaxis_index=2, # label_opts=opts.LabelOpts(is_show=False), # markline_opts=opts.MarkLineOpts( # data=[opts.MarkLineItem(type_="average", name="平均值")] # ), # itemstyle_opts=opts.ItemStyleOpts( # color=JsCode( # """ # function(params) { # var colorList; # if (params.data >= 0) { # colorList = '#ef232a'; # } else { # colorList = '#14b143'; # } # return colorList; # } # """ # # """ # # function(params) { # # var colorList; # # if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { # # colorList = '#ef232a'; # # } else { # # colorList = '#14b143'; # # } # # return colorList; # # } # # """ # ) # ), # ) # .set_global_opts( # title_opts=opts.TitleOpts( # title='', # ), # xaxis_opts=opts.AxisOpts( # type_="category", # grid_index=2, # is_scale=True, # # axislabel_opts=opts.LabelOpts(is_show=False), # boundary_gap=False, # axisline_opts=opts.AxisLineOpts(is_on_zero=False), # axistick_opts=opts.AxisTickOpts(is_show=False), # splitline_opts=opts.SplitLineOpts(is_show=False), # axislabel_opts=opts.LabelOpts(is_show=False), # split_number=20, # min_="dataMin", # max_="dataMax", # ), # yaxis_opts=opts.AxisOpts( # grid_index=2, # is_scale=True, # split_number=2, # axislabel_opts=opts.LabelOpts(is_show=False), # axisline_opts=opts.AxisLineOpts(is_show=False), # axistick_opts=opts.AxisTickOpts(is_show=False), # splitarea_opts=opts.SplitAreaOpts( # is_show=True, # areastyle_opts=opts.AreaStyleOpts(opacity=1) # ), # ), # # xaxis_opts=opts.AxisOpts(is_scale=True), # legend_opts=opts.LegendOpts(is_show=False), # datazoom_opts=opts.DataZoomOpts(type_="inside"), # ) # ) # # overlap = overlap.overlap(Volume_Bar) print("it's here") if len(stock_zs_x) != 0: for i in range(0, len(stock_zs_x), 2): zs1_line = (Line().add_xaxis( xaxis_data=stock_zs_x[i:i + 2], ).add_yaxis( series_name="中枢", y_axis=np.append(stock_zs_y[i], stock_zs_y[i]), is_smooth=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(color="red", width=1.5, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) zs2_line = (Line().add_xaxis( xaxis_data=stock_zs_x[i:i + 2], ).add_yaxis( series_name="中枢", y_axis=np.append(stock_zs_y[i + 1:i + 2], stock_zs_y[i + 1:i + 2]), is_smooth=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(color="red", width=1.5, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) zs3_line = (Line().add_xaxis(xaxis_data=np.append( stock_zs_x[i:i + 1], stock_zs_x[i:i + 1])).add_yaxis( series_name="中枢", y_axis=stock_zs_y[i:i + 2], is_smooth=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(color="red", width=1.5, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) zs4_line = (Line().add_xaxis(xaxis_data=np.append( stock_zs_x[i + 1:i + 2], stock_zs_x[i + 1:i + 2])).add_yaxis( series_name="中枢", y_axis=stock_zs_y[i:i + 2], is_smooth=False, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(color="red", width=1.5, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) zs1 = zs1_line.overlap(zs2_line) zs2 = zs3_line.overlap(zs4_line) zs = zs1.overlap(zs2) overlap.overlap(zs) overlap.render("diagram/{0}@{1}#{2}.html".format(stock[0:6], end_time[0:10], period)) print("it's done")
def draw_chart(): kline = (Kline().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="", y_axis=data["datas"], itemstyle_opts=opts.ItemStyleOpts(color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143"), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ]), markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts(position="middle", color="blue", font_size=15), data=split_data_part(), symbol=["circle", "none"], ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=split_data_part())).set_global_opts( title_opts=opts.TitleOpts(title="K线周期图表", pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts(is_show=True, type_="inside", xaxis_index=[0, 0], range_end=100), opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], )) kline_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="MA5", y_axis=calculate_ma(day_count=5), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), )) overlap_kline_line = kline.overlap(kline_line) bar_1 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="Volumn", y_axis=data["vols"], label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params){ var colorList; if(barData[params.dataIndex][1] > barData[params.dataIndex][0]){ colorList = '#ef232a'; }else{ colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", axislabel_opts=opts.LabelOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) bar_2 = (Bar().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="MACD", y_axis=data["macds"], label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params){ var colorList; if(params.data >= 0){ colorList = '#ef232a'; }else{ colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), legend_opts=opts.LegendOpts(is_show=False), )) line_2 = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="DIF", y_axis=data["difs"], label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) overlap_bar_line = bar_2.overlap(line_2) grid_chart = Grid(init_opts=opts.InitOpts( width="1400px", height="800px", theme=ThemeType.ESSOS)) grid_chart.add_js_funcs("var barData={}".format(data["datas"])) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) grid_chart.add(overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%")) grid_chart.render("professional_kline_chart.html")
def grid_vertical(xaxis, taixin_yaxis, yali_yaxis, td_yaxis): max_taixin = max(taixin_yaxis) + 20 min_taixin = min(taixin_yaxis) - 60 if min_taixin <= 0: min_taixin = 0 line1 = (Line().add_xaxis(xaxis).add_yaxis( "胎心率", taixin_yaxis, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average", name="胎心率平均值")]), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_="max", name="胎心率最大值"), ]), ).add_yaxis("下限", [120, 120], markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average")])).add_yaxis( "上限", [160, 160], markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average")])). add_yaxis( "胎动", td_yaxis, label_opts=opts.LabelOpts(is_show=False), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_="None", name="胎动"), ]), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_='value', interval=120, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(formatter="{value}秒"), ), yaxis_opts=opts.AxisOpts( type_='value', interval=10, min_=min_taixin, max_=max_taixin, splitline_opts=opts.SplitLineOpts(is_show=True)), title_opts=opts.TitleOpts(title="eFM-60超声多普勒胎儿监护仪监测曲线图"), tooltip_opts=opts.TooltipOpts(trigger="axis"), toolbox_opts=opts.ToolboxOpts(is_show=True, ), ).set_series_opts( label_opts=opts.LabelOpts(is_show=False), markarea_opts=opts.MarkAreaOpts(data=[ opts.MarkAreaItem(name="合理区间", y=(120, 160), itemstyle_opts=opts.ItemStyleOpts( color="#A0D897", opacity=0.2)), ]))) line2 = ( Line().add_xaxis(xaxis).add_yaxis( "宫内压力", yali_yaxis, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False).set_global_opts( xaxis_opts=opts.AxisOpts( type_='value', interval=120, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(formatter="{value}秒"), ), yaxis_opts=opts.AxisOpts( type_='value', interval=10, min_=0, max_=100, splitline_opts=opts.SplitLineOpts(is_show=True)), # title_opts=opts.TitleOpts(title="") tooltip_opts=opts.TooltipOpts(trigger="axis"), toolbox_opts=opts.ToolboxOpts(is_show=True), legend_opts=opts.LegendOpts(pos_top="50%"), ).set_series_opts(label_opts=opts.LabelOpts(is_show=False), )) # 把上面生成的两个图放进grid中并通过pos_top,pos_bottom, pos_left, pos_right设置其位置 grid = (Grid(init_opts=opts.InitOpts(width="3000px", height="600px")).add( line2, grid_opts=opts.GridOpts(pos_top='60%', pos_left='2%')).add( line1, grid_opts=opts.GridOpts(pos_bottom="60%", pos_left='2%'))) # 生成到本地网页形式打开,也可自己设置保存成png图片,因为网页的使用更方便,自己按情况使用 grid.render('1.html') # 输出保存为图片 make_snapshot(snapshot, grid.render(), "1.png") print(">>图表生成完毕!")
def kline_pro(kline: List[dict], fx: List[dict] = None, xd=None, bs: List[dict] = None, title: str = "缠中说禅K线分析", width: str = "1400px", height: str = '580px') -> Grid: """绘制缠中说禅K线分析结果 :param kline: K线 :param fx: 分型识别结果 :param bi: 笔识别结果 :param xd: 线段识别结果 :param zs: 中枢 :param bs: 买卖点 :param title: 图表标题 :param width: 图表宽度 :param height: 图表高度 :return: 用Grid组合好的图表 """ # 配置项设置 # ------------------------------------------------------------------------------------------------------------------ bg_color = "#1f212d" # 背景 up_color = "#F9293E" down_color = "#00aa3b" init_opts = opts.InitOpts(bg_color=bg_color, width=width, height=height, animation_opts=opts.AnimationOpts(False)) title_opts = opts.TitleOpts( title=title, pos_top="1%", title_textstyle_opts=opts.TextStyleOpts(color=up_color, font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color=down_color, font_size=12)) label_not_show_opts = opts.LabelOpts(is_show=False) legend_not_show_opts = opts.LegendOpts(is_show=False) red_item_style = opts.ItemStyleOpts(color=up_color) green_item_style = opts.ItemStyleOpts(color=down_color) k_style_opts = opts.ItemStyleOpts(color=up_color, color0=down_color, border_color=up_color, border_color0=down_color, opacity=0.8) legend_opts = opts.LegendOpts(is_show=True, pos_top="1%", pos_left="30%", item_width=14, item_height=8, textstyle_opts=opts.TextStyleOpts( font_size=12, color="#0e99e2")) brush_opts = opts.BrushOpts(tool_box=["rect", "polygon", "keep", "clear"], x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX") axis_pointer_opts = opts.AxisPointerOpts(is_show=True, link=[{ "xAxisIndex": "all" }]) range_start = int(100 - 216 / len(kline) * 100) dz_inside = opts.DataZoomOpts(False, "inside", xaxis_index=[0, 1, 2], range_start=range_start, range_end=100) dz_slider = opts.DataZoomOpts(True, "slider", xaxis_index=[0, 1, 2], pos_top="96%", pos_bottom="0%", range_start=range_start, range_end=100) yaxis_opts = opts.AxisOpts(is_scale=True, axislabel_opts=opts.LabelOpts( color="#c7c7c7", font_size=8, position="inside")) grid0_xaxis_opts = opts.AxisOpts( type_="category", grid_index=0, axislabel_opts=label_not_show_opts, split_number=20, min_="dataMin", max_="dataMax", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False)) tool_tip_opts = opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", position=JsCode(""" function (pos, params, el, elRect, size) { var obj = {top: 10}; obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30; return obj; } """), textstyle_opts=opts.TextStyleOpts(color="#000"), ) # 数据预处理 # ------------------------------------------------------------------------------------------------------------------ # dts = [x.get('dt', x['date']) for x in kline] try: dts = [x['date'] for x in kline] except: dts = [x['dt'] for x in kline] # k_data = [[x['open'], x['close'], x['low'], x['high']] for x in kline] k_data = [ opts.CandleStickItem( name=i, value=[x['open'], x['close'], x['low'], x['high']]) for i, x in enumerate(kline) ] vol = [] for i, row in enumerate(kline): item_style = red_item_style if row['close'] > row[ 'open'] else green_item_style bar = opts.BarItem(name=i, value=row['volume'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) close = np.array([x['close'] for x in kline], dtype=np.double) diff, dea, macd = MACD(close) ma5 = SMA(close, timeperiod=5) ma34 = SMA(close, timeperiod=34) ma55 = SMA(close, timeperiod=55) ma233 = SMA(close, timeperiod=233) macd_bar = [] for i, v in enumerate(macd.tolist()): item_style = red_item_style if v > 0 else green_item_style bar = opts.BarItem(name=i, value=round(v, 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd_bar.append(bar) diff = diff.round(4) dea = dea.round(4) # K 线主图 # ------------------------------------------------------------------------------------------------------------------ chart_k = Kline() chart_k.add_xaxis(xaxis_data=dts) chart_k.add_yaxis(series_name="Kline", y_axis=k_data, itemstyle_opts=k_style_opts) chart_k.set_global_opts(legend_opts=legend_opts, datazoom_opts=[dz_inside, dz_slider], yaxis_opts=yaxis_opts, tooltip_opts=tool_tip_opts, axispointer_opts=axis_pointer_opts, brush_opts=brush_opts, title_opts=title_opts, xaxis_opts=grid0_xaxis_opts) if xd: index = 0 zs_colors = [ "yellow", "white", '#f034c1', "#7944b7", "#468b58", "#c17f2f", "#9EA0A1" ] data = [] temp_xd = xd while temp_xd: zs_color = zs_colors[index % len(zs_colors)] data = data + [ opts.MarkAreaItem( name='XD{}'.format(index), x=(x['xd_list'][0]['date'], x['xd_list'][-1]['date']), y=(x['ZG']['value'], x['ZD']['value']), label_opts=opts.LabelOpts(color=zs_color), itemstyle_opts=opts.ItemStyleOpts( color=zs_color, opacity=0.2, )) for x in temp_xd.zs_list ] temp_xd = temp_xd.next index = index + 1 chart_k.set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True, data=data)) # 均线图 # ------------------------------------------------------------------------------------------------------------------ chart_ma = Line() chart_ma.add_xaxis(xaxis_data=dts) ma_keys = {"MA5": ma5, "MA34": ma34, "MA55": ma55, "MA233": ma233} ma_colors = ["#39afe6", "#da6ee8", "#A02128", "#00940b"] for i, (name, ma) in enumerate(ma_keys.items()): chart_ma.add_yaxis(series_name=name, y_axis=ma, is_smooth=True, is_selected=False, symbol_size=0, label_opts=label_not_show_opts, linestyle_opts=opts.LineStyleOpts( opacity=0.8, width=1.0, color=ma_colors[i])) chart_ma.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_ma) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ if fx: try: fx_dts = [x['date'] for x in fx] except: fx_dts = [x['dt'] for x in fx] fx_val = [x['value'] for x in fx] chart_fx = Scatter() chart_fx.add_xaxis(fx_dts) chart_fx.add_yaxis(series_name="FX", y_axis=fx_val, is_selected=False, symbol="circle", symbol_size=6, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts( color="rgba(152, 147, 193, 1.0)", )) chart_fx.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_fx) if xd: index = 0 xd_colors = zs_colors while xd: xd_dts = [x['date'] for x in xd] xd_val = [x['value'] for x in xd] chart_xd = Line() chart_xd.add_xaxis(xd_dts) xd_color = xd_colors[index % len(xd_colors)] chart_xd.add_yaxis( series_name="XD{}".format(index), y_axis=xd_val, is_selected=True, symbol="triangle", symbol_size=10, linestyle_opts=opts.LineStyleOpts(color=xd_color, width=index + 1, type_="solid"), itemstyle_opts=opts.ItemStyleOpts(color=xd_color)) chart_xd.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_xd) xd = xd.next index = index + 1 if bs: b_dts = [x['date'] for x in bs if x['bs'] == 'buy'] if len(b_dts) > 0: b_val = [x['value'] for x in bs if x['bs'] == 'buy'] chart_b = Scatter() chart_b.add_xaxis(b_dts) chart_b.add_yaxis(series_name="BUY", y_axis=b_val, is_selected=False, symbol="arrow", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts( color="#f31e1e", )) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_b) s_dts = [x['date'] for x in bs if x['bs'] == 'sell'] if len(s_dts) > 0: s_val = [x['value'] for x in bs if x['bs'] == 'sell'] chart_s = Scatter() chart_s.add_xaxis(s_dts) chart_s.add_yaxis(series_name="SELL", y_axis=s_val, is_selected=False, symbol="pin", symbol_size=12, itemstyle_opts=opts.ItemStyleOpts( color="#45b97d", )) chart_s.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_s) # 成交量图 # ------------------------------------------------------------------------------------------------------------------ chart_vol = Bar() chart_vol.add_xaxis(dts) chart_vol.add_yaxis(series_name="Volume", y_axis=vol, bar_width='60%') chart_vol.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=True, font_size=8, color="#9b9da9"), ), yaxis_opts=yaxis_opts, legend_opts=legend_not_show_opts, ) # MACD图 # ------------------------------------------------------------------------------------------------------------------ chart_macd = Bar() chart_macd.add_xaxis(dts) chart_macd.add_yaxis(series_name="MACD", y_axis=macd_bar, bar_width='60%') chart_macd.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, color="#c7c7c7"), ), legend_opts=opts.LegendOpts(is_show=False), ) line = Line() line.add_xaxis(dts) line.add_yaxis(series_name="DIFF", y_axis=diff, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#da6ee8")) line.add_yaxis(series_name="DEA", y_axis=dea, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#39afe6")) chart_macd = chart_macd.overlap(line) grid0_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="12%", height="58%") grid1_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="74%", height="8%") grid2_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="86%", height="10%") grid_chart = Grid(init_opts) grid_chart.add(chart_k, grid_opts=grid0_opts) grid_chart.add(chart_vol, grid_opts=grid1_opts) grid_chart.add(chart_macd, grid_opts=grid2_opts) return grid_chart
oclh, itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), # markpoint_opts=opts.MarkPointOpts( # data=[ # opts.MarkPointItem(type_="max", name="最大值"), # opts.MarkPointItem(type_="min", name="最小值"), # ] # ) ) kline.set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=markareadata, itemstyle_opts=opts.ItemStyleOpts(opacity=0.5, ))) kline.set_global_opts( xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True), ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts(type_="inside", range_start=-100), opts.DataZoomOpts(pos_bottom="0%"), ], # title_opts=opts.TitleOpts(title=stock_code), )