def geo(self, id=None): """ 话题地理传播路径 :param id: :return: """ if self.geohtml and (not id or self.id == id): self.load(QUrl('file:///' + dirname + '/qt/buffer/geo.html')) self.flag = 5 return self.id = id provinces = {} links = [] topic = self.topic.find_one({'_id': id}) for weibo_id in topic['text_id_list']: if MONGO_DB == 'weibo': data = self.repost.find_one({'id': weibo_id}) if not data: continue uid = data['uid'] dataset = self.repost.find({'uid': uid}) for data in dataset: if data['area']: province = self.get_province(data['area']) if province: if province not in provinces: provinces[province] = 0 provinces[province] += 1 break else: weibo = self.weibo.find_one({'id': weibo_id}) user = self.user.find_one({'uid': weibo['uid']}) if not user: continue if user['area']: # print(user['area']) province = self.get_province(user['area']) # print(province) if province: if province not in provinces: provinces[province] = 0 provinces[province] += 1 temp = None for province in provinces: if not temp: temp = province continue links.append((temp, province)) temp = province # print(provinces) # print(links) c = ( Geo() .add_schema(maptype="china") .add( "geo", [(key, value) for key, value in provinces.items()], type_=ChartType.EFFECT_SCATTER, ) .add( "geo", links, type_=ChartType.LINES, effect_opts=opts.EffectOpts( symbol=SymbolType.ARROW, symbol_size=6, color="blue" ), linestyle_opts=opts.LineStyleOpts(curve=0.2), ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="话题地理传播路径图") ) ) html = c.render_embed() html = re.sub(r'width:\d+px', 'width:100%', html) html = re.sub(r'height:\d+px', 'height:800px', html) with open(dirname + '/qt/buffer/geo.html', 'w') as f: f.write(html) self.geohtml = True self.load(QUrl('file:///' + dirname + '/qt/buffer/geo.html')) self.flag = 5
from pywebio.output import put_html from pyecharts import options as opts from pyecharts.charts import Geo from pyecharts.faker import Faker c = ( Geo() .add_schema(maptype="china") .add("geo", [list(z) for z in zip(Faker.provinces, Faker.values())]) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="Geo-基本示例") ) ) c.width = "100%" put_html(c.render_notebook())
from pyecharts.charts import Geo from pyecharts.globals import ChartType from pyecharts import options as opts # bar = Bar() # bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]) # bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90]) # render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件 # 也可以传入路径参数,如 bar.render("mycharts.html") # bar.render() citys = ['丰县', '沛县', '铜山区', '贾汪区', '鼓楼区', '泉山区', '云龙区', '邳州市', '新沂市', '睢宁县'] values = [120, 160, 180, 200, 180, 190, 130, 160, 140, 170] geo = Geo() geo.add_schema(maptype="徐州") geo.add_coordinate("某地", 117.3, 34.3) print([list(z) for z in zip(citys, values)]) geo.add("test", [list(z) for z in zip(citys, values)], type_=ChartType.EFFECT_SCATTER) geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="Geo地图示例")) geo.render("测试.html")
mymap.add(series_name='中国最新疫情地图', data_pair=sequence, maptype='china') mymap.set_global_opts( visualmap_opts=opts.VisualMapOpts(pieces=[{ "min": 1, "max": 9, "label": "1-9", "color": 'lightcoral' }, { "min": 10, "max": 99, "label": "10-99", "color": 'indianred' }, { "min": 100, "max": 999, "label": "100-999", "color": 'brown' }, { "min": 1000, "max": 9999, "label": "1000-9999", "color": 'firebrick' }, { "min": 10000, "max": 60000, "label": "≥10000", "color": 'darkred' }], is_piecewise=True)) mymap.render('地图2.html')
from pyecharts.charts import Geo from pyecharts import options as opts data = [['广东', 24], ['北京', 56], ['上海', 56], ['江西', 119], ['湖南', 79], ['浙江', 23], ['江苏', 97]] # 采用链式调用 chart = ( Geo() # 控制地图类型、视角中心点等 .add_schema(maptype="china") # 添加图表名称、传入数据集、选择geo图类型、调整图例等 .add("geo", data) # 系列配置项 series_options .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 全局配置项 global_options .set_global_opts( visualmap_opts=opts.VisualMapOpts(), title_opts=opts.TitleOpts(title="Geo_China"), )) chart.render('geo1.html')
def draw_chart(df, extend_field, save_path="", trade_list=None, kline_title="买卖点K线图"): 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 trade_list is None: trade_list = [] 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") 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"))) 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_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", yaxis_data=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=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=2, opacity=0.8), label_opts=opts.LabelOpts(is_show=False), ) # 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"))
Line3D() .add( "", data, xaxis3d_opts=opts.Axis3DOpts(data=clock, type_="value"), yaxis3d_opts=opts.Axis3DOpts(data=week_en, type_="value"), grid3d_opts=opts.Grid3DOpts(width=100, height=100, depth=100), ) .set_global_opts( visualmap_opts=opts.VisualMapOpts( dimension=2, max_=30, min_=0, range_color=[ "#313695", "#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027", "#a50026", ], ) ) .render("line3d_rectangular_projection.html") )
def Candle_render_output(x_date, y_data, vol_data) -> Grid: # ydata type : open close low high # vol_data is for bar print('Candle_render_output') kline = (Kline().add_xaxis(xaxis_data=x_date).add_yaxis( series_name="Dow-Jones index", y_axis=y_data, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( title_opts=opts.TitleOpts( title="Kline)", subtitle="MA(5, 10, 30, 60)", ), 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=False, pos_bottom=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="90%", range_start=0, 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=5, 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", ), )) bar = ( Bar().add_xaxis(xaxis_data=x_date).add_yaxis( series_name="Volume", # yaxis_data=[ # [i, y_data[i][3], 1 if y_data[i][0] > y_data[i][1] else -1] # for i in range(len(y_data)) # ], yaxis_data=vol_data, 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), )) lines = Kline_ma_line(x_date, y_data) kline = kline.overlap(lines) # Grid Overlap + Bar grid_chart = Grid() grid_chart.add(kline, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="50%")) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="70%", height="16%"), ) return grid_chart
#!/usr/bin/env python # -*-coding:utf-8 -*- import os import re import linecache import math import time import shutil # import numpy as np from pyecharts import options as opts from pyecharts.charts import Map os.chdir(os.path.split(os.path.realpath(__file__))[0]) a1 = ['北京', '上海', '广东省'] a2 = [1, 2, 3] output = (Map().add("污染指数", zip( a1, a2), "china", is_map_symbol_show=False).set_global_opts( title_opts=opts.TitleOpts(title="2020年4月生态环境部通报"), visualmap_opts=opts.VisualMapOpts(min_=1, max_=3)).render("重点城市环境空气排名2.html"))
import pyecharts from pyecharts.charts import Bar # 柱状图 from pyecharts import options as ops from pyecharts.globals import ThemeType # 内置主题类型 bar = ( Bar(init_opts=ops.InitOpts(theme="")).add_xaxis( ["xxx", "juice", "14", "ts", "drake", "young thug"]).add_yaxis("商家A", [100, 20, 36, 10, 75, 90]) # 全局配置项 .set_global_opts( # 标题配置项 title_opts=ops.TitleOpts( # 主标题 title="hello", subtitle="hhh"), # 图例配置项 legend_opts=ops.LegendOpts(is_show=True), # 工具配置项 toolbox_opts=ops.ToolboxOpts(is_show=False), # 视觉映射配置项 visualmap_opts=ops.VisualMapOpts(is_show=True, # type_="color" ))) bar.render("柱状图.html") # 使用 options 配置项,在 pyecharts 中,一切皆 Options。 # 全局配置项可通过 set_global_opts 方法设置
page.add(bar) # 产品数量前15店铺柱状图 bar1 = (Bar().add_xaxis( shop_name_group['shop_name'].values.tolist()[:15]).add_yaxis( '产品数量前15店铺', shop_name_group['title'].values.tolist()[:15]).set_global_opts( xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts( rotate=30)))) page.add(bar1) # 销量前15店铺饼状图 pie = (Pie().add('', sell_data.values.tolist()[:15]).set_global_opts( title_opts=opts.TitleOpts(title='销量前15店铺', pos_left='center'), legend_opts=opts.LegendOpts(is_show=False))) page.add(pie) # 店铺位置分布图 shop_map = (Map().add( '', location_data.values.tolist(), 'china').set_global_opts( title_opts=opts.TitleOpts(title='店铺位置分布图'), visualmap_opts=opts.VisualMapOpts( max_=max(location_data['shop_name'].values.tolist()), min_=min(location_data['shop_name'].values.tolist()), is_show=True))) page.add(shop_map) page.render()
def kline_profession_example() -> Grid: data = [ [2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38], [2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8], [2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82], [2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38], [2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73], [2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03], [2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07], [2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82], [2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78], [2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63], [2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65], [2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14], [2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02], [2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96], [2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33], [2255.77, 2270.28, 2253.31, 2276.22], ] def calculate_ma(day_count: int, d): result: List[Union[float, str]] = [] for i in range(len(d)): if i < day_count: result.append("-") continue sum_total = 0.0 for j in range(day_count): sum_total += float(d[i - j][1]) result.append(abs(float("%.3f" % (sum_total / day_count)))) return result x_data = ["2017-7-{}".format(i + 1) for i in range(31)] kline = (Kline().add_xaxis(xaxis_data=x_data).add_yaxis( series_name="Dow-Jones index", y_axis=data, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( title_opts=opts.TitleOpts( title="上证指数", subtitle="MA5", ), 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=False, pos_bottom=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="90%", range_start=0, 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=5, 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", ), )) line = (Line().add_xaxis(xaxis_data=x_data).add_yaxis( series_name="MA5", y_axis=calculate_ma(day_count=5, d=data), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) bar = (Bar().add_xaxis(xaxis_data=x_data).add_yaxis( series_name="Volume", yaxis_data=[[i, data[i][3], 1 if data[i][0] > data[i][1] else -1] for i in range(len(data))], 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), )) # Kline And Line overlap_kline_line = kline.overlap(line) # Grid Overlap + Bar grid_chart = Grid() grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="50%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="70%", height="16%"), ) return grid_chart
from pyecharts.charts import MapGlobe, Grid from pyecharts.globals import ThemeType high = max([x for _, x in POPULATION[1:]]) low = min([x for _, x in POPULATION[1:]]) m = ( MapGlobe(init_opts=opts.InitOpts( width="1920px", height="900px", page_title="全球互联网网络地图", theme=ThemeType.WALDEN)).add_schema().add( maptype="world", series_name="World Population", data_pair=POPULATION[1:], is_map_symbol_show=False, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( # title_opts=opts.TitleOpts(title="全球互联网网络AS号分布图"), visualmap_opts=opts.VisualMapOpts( min_=low, max_=high, range_text=["max", "min"], is_calculable=True, # is_piecewise=True, orient="horizontal", pos_right="20%", range_color=["lightskyblue", "yellow", "orangered"], ))) m.render("geo_global_3D.html")
import pyecharts.options as opts from pyecharts.charts import MapGlobe from pyecharts.faker import POPULATION data = [x for _, x in POPULATION[1:]] low, high = min(data), max(data) c = (MapGlobe().add_schema().add( maptype="world", series_name="World Population", data_pair=POPULATION[1:], is_map_symbol_show=False, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(visualmap_opts=opts.VisualMapOpts( min_=low, max_=high, range_text=["max", "min"], is_calculable=True, range_color=["lightskyblue", "yellow", "orangered"], )).render("map_globe.html"))
visualmap_opts=opts.VisualMapOpts( is_piecewise=True, # 设置是否为分段显示 # 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式。例如: pieces=[ { "min": 4000, "label": '>4000人', "color": "#eb2f06" }, { "min": 2000, "max": 4000, "label": '2001-4000人', "color": "#FF3030" }, # 不指定 max,表示 max 为无限大(Infinity)。 { "min": 1000, "max": 2000, "label": '1001-2000人', "color": "#FF4500" }, { "min": 500, "max": 1000, "label": '501-1000人', "color": "#FF7F50" }, { "min": 100, "max": 500, "label": '100-500人', "color": "#FFA500" }, { "min": 1, "max": 100, "label": '1-99人', "color": "#FFDEAD" }, ], # 两端的文本,如['High', 'Low']。 range_text=['高', '低'], ),
visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pos_top=50, pos_right=10, pieces=[{ 'min': 0, 'max': 50, 'color': '#93CE07' }, { 'min': 50, 'max': 100, 'color': '#FBDB0F' }, { 'min': 100, 'max': 150, 'color': '#FC7D02' }, { 'min': 150, 'max': 200, 'color': '#FD0100' }, { 'min': 200, 'max': 300, 'color': '#AA069F' }, { 'min': 300, 'color': '#AC3B2A' }]),
def MultipleLineCharts(datas): line = Line(init_opts=opts.InitOpts(width="100%")) line.add_xaxis(xaxis_data=[item[0] for item in datas[1][0][1]]) # 设置x轴数据 for data in datas[1]: line.add_yaxis( series_name=data[0], y_axis=[item[1] for item in data[1]], yaxis_index=0, is_smooth=True, is_symbol_show=False, is_connect_nones=True, ) # 设置y轴数据 line.set_global_opts( title_opts=opts.TitleOpts(title=datas['title']), tooltip_opts=opts.TooltipOpts(trigger="axis"), datazoom_opts=[ opts.DataZoomOpts(yaxis_index=0, range_start=0, range_end=100), opts.DataZoomOpts(type_="inside", yaxis_index=0), ], visualmap_opts=opts.VisualMapOpts( pos_top="10", pos_right="10", is_piecewise=True, pieces=[ { "gt": 0, "lte": 25, "color": "#096" }, { "gt": 25, "lte": 50, "color": "#ffde33" }, { "gt": 50, "lte": 75, "color": "#ff9933" }, { "gt": 75, "color": "#cc0033" }, ], out_of_range={"color": "#999"}, ), xaxis_opts=opts.AxisOpts(type_="category"), yaxis_opts=opts.AxisOpts( type_="value", name_location="start", min_=0, max_=100, is_scale=True, axistick_opts=opts.AxisTickOpts(is_inside=False), ), ) line.set_series_opts(markline_opts=opts.MarkLineOpts( data=[ { "yAxis": 25 }, { "yAxis": 50 }, { "yAxis": 75 }, ], label_opts=opts.LabelOpts(position="end"), )) # line.render()#渲染图表,默认文件名为render.html return line.render_embed()
def to_map_city(self, city, variate, province, update_time): #pices定义数据分段 pieces = [ { "max": 59999, "min": 10000, "label": ">10000", "color": "#990033" }, { "max": 9999, "min": 5000, "label": "5000-9999", "color": "#CC0033" }, { "max": 4999, "min": 1000, "label": "1000-4999", "color": "#FF0033" }, { "max": 999, "min": 100, "label": "100-999", "color": "#FF6633" }, { "max": 99, "min": 50, "label": "50-99", "color": "#FF9900" }, { "max": 49, "min": 10, "label": "10-49", "color": "#FFCC66" }, { "max": 9, "min": 1, "label": "1-9", "color": "#FFFFCC" }, { "max": 0, "min": 0, "label": "0", "color": "#FFFFFF" }, ] c = ( # 设置地图大小 Map(init_opts=opts.InitOpts(width='1000px', height='880px') ).add("累计确诊人数", [list(z) for z in zip(city, variate)], province, is_map_symbol_show=False) #设置不显示市级名称 .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 设置全局变量 .set_global_opts( title_opts=opts.TitleOpts(title="%s地区疫情地图分布" % (province), subtitle='截止%s %s省疫情分布情况' % (update_time, province), pos_left="center", pos_top="10px"), legend_opts=opts.LegendOpts(is_show=False), visualmap_opts=opts.VisualMapOpts( max_=200, is_piecewise=True, pieces=pieces, ), ).render("./map/china/{}疫情地图.html".format(province)))
def draw_charts(echarts_data): kline_data = echarts_data["data"] date = echarts_data["date"] kline = ( Kline().add_xaxis(xaxis_data=date).add_yaxis( series_name="Dow-Jones index", y_axis=kline_data, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( legend_opts=opts.LegendOpts(is_show=False, pos_bottom=10, pos_left="center"), # 其中inside是支持鼠标缩放 datazoom_opts=[ opts.DataZoomOpts( is_show=True, type_="inside", xaxis_index=[0, 1, 2, 3, 4], range_start=50, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1, 2, 3, 4], type_="slider", range_start=50, range_end=100, ), ], # # 不知道为什么要分开三个写,可能是想通过xaxis_index分别配置 # 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), # ], yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), title_opts=opts.TitleOpts(title="my_echart"), 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" }, ], ), # 所有图的axis 连在一块 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", ), )) line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="MA5", y_axis=echarts_data['ma5'], is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, # 去掉折线上的小圆点 ).add_yaxis( series_name="MA20", y_axis=echarts_data['ma20'], is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, # 去掉折线上的小圆点 ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) # Kline And Line overlap_kline_line = kline.overlap(line) bar = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="Volume", y_axis=echarts_data['volume'], 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", 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), )) # Bar-2 (Overlap Bar + Line) bar_2 = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="MACD", y_axis=echarts_data['macd'], 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), # 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, ), 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), )) macd_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="DIFF", y_axis=echarts_data['macd_diff'], # xaxis_index=2, # yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DEA", y_axis=echarts_data["macd_dea"], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ) # .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) # MACD BAR And MACD Line bar_macd_line = bar_2.overlap(macd_line) # KDJ kdj_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="K", y_axis=echarts_data['kdj_k'], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="D", y_axis=echarts_data["kdj_d"], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="J", y_axis=echarts_data["kdj_j"], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), # markline_opts=opts.MarkLineOpts( # data=[100] # ), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=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, ), )) ###################### ## kdj的macd # Bar-2 (Overlap Bar + Line) macd_kdj_bar = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="MACD_KDJ", y_axis=echarts_data['kdj_macd'], 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), # 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, ), 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), )) macd_kdj_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="KDJ_DIFF", y_axis=echarts_data['kdj_macd_diff'], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="KDJ_DEA", y_axis=echarts_data["kdj_macd_dea"], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ) # .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) # MACD BAR And MACD Line bar_macd_kdj_line = macd_kdj_bar.overlap(macd_kdj_line) ###################### # Grid Overlap + Bar grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="800px", animation_opts=opts.AnimationOpts(animation=False), )) # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format(kline_data)) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="30%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="35%", height="10%"), ) # 加上MACD grid_chart.add( bar_macd_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="45%", height="10%", ), ) # 加上KDJ grid_chart.add( kdj_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="55%", height="10%", ), ) # 加上KDJ的MACD grid_chart.add( bar_macd_kdj_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="65%", height="10%", ), ) grid_chart.render("300368.html")
def to_map_world(self, country, variate, confirmed_glo, update_time): pieces = [ { "max": 9999999, "min": 1000000, "label": ">1000000", "color": "#990033" }, { "max": 999999, "min": 100000, "label": "100000-999999", "color": "#CC0033" }, { "max": 99999, "min": 10000, "label": "10000-99999", "color": "#FF0033" }, { "max": 9999, "min": 1000, "label": "1000-9999", "color": "#FF6633" }, { "max": 999, "min": 100, "label": "100-999", "color": "#FF9900" }, { "max": 99, "min": 10, "label": "10-99", "color": "#FFCC66" }, { "max": 9, "min": 1, "label": "1-9", "color": "#FFFFCC" }, { "max": 0, "min": 0, "label": "0", "color": "#FFFFFF" }, ] c = ( # 设置地图大小 Map(init_opts=opts.InitOpts(width='1000px', height='880px') ).add("累计确诊人数", [list(z) for z in zip(country, variate)], "world", is_map_symbol_show=False) #设置不显示国家名称 .set_series_opts(label_opts=opts.LabelOpts(is_show=False) ).set_global_opts( title_opts=opts.TitleOpts( title="世界疫情地图分布", subtitle='截止{0}世界已确诊人数{1}'.format( update_time, confirmed_glo), pos_left="center", pos_top="10px"), legend_opts=opts.LegendOpts(is_show=False), visualmap_opts=opts.VisualMapOpts( max_=200, is_piecewise=True, pieces=pieces, ), ).render("./map/世界疫情地图.html"))
from pyecharts.charts import Map from pyecharts import options as opts from pyecharts.faker import Faker (Map(init_opts=opts.InitOpts(width='900px', height='600px')).add( series_name='商家A', data_pair=[list(z) for z in zip(Faker.guangdong_city, Faker.values())], maptype='广东').set_global_opts(title_opts=opts.TitleOpts(title="Map-广东地图"), visualmap_opts=opts.VisualMapOpts()).render( './picture/my_guangdong.html'))
] data.append(temp) calend = ( charts.Calendar() # range_决定了时间尺度 .add(series_name='', yaxis_data=data, calendar_opts=opts.CalendarOpts(range_='2018')) # .add(series_name='', yaxis_data=data, calendar_opts=opts.CalendarOpts(range_=['2018-1', '2018-7'])) # range_决定了时间尺度 .set_global_opts( title_opts=opts.TitleOpts(title='Calendar-2018年微信步数'), visualmap_opts=opts.VisualMapOpts( max_=25000, min_=100, range_size=[10, 20], # 不知道干嘛的 orient='horizontal', is_calculable=True, is_piecewise=True, # 颜色条是否分成pieces:True:pices, False:一根长条 pos_top='230px', pos_left='100px', ), )) # calend.render('calendar_echats.html') page.add(calend) from pyecharts import options as opts from pyecharts.globals import SymbolType words = [ ("Sam S Club", 10000), ("Macys", 6181), ("Amy Schumer", 4386), ("Jurassic World", 4055),
def map_visualmap(): c = (Map().add("男", [list(z) for z in zip(attr_1, value_1)], "china").add( "女", [list(z) for z in zip(attr_2, value_2)], "china").set_global_opts( title_opts=opts.TitleOpts(title="Map-VisualMap(连续型)"), visualmap_opts=opts.VisualMapOpts(max_=200, is_piecewise=True))) return c
""" begin = datetime.date(2017, 1, 1) end = datetime.date(2017, 12, 31) data = [ [str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)] for i in range((end - begin).days + 1) ] ( Calendar(init_opts=opts.InitOpts(width="1600px", height="1000px")) .add( series_name="", yaxis_data=data, calendar_opts=opts.CalendarOpts( pos_top="120", pos_left="30", pos_right="30", range_="2017", yearlabel_opts=opts.LabelOpts(is_show=False), ), ) .set_global_opts( title_opts=opts.TitleOpts(pos_top="30", pos_left="center", title="2017年步数情况"), visualmap_opts=opts.VisualMapOpts( max_=20000, min_=500, orient="horizontal", is_piecewise=False ), ) .render("calendar_heatmap.html") )
def Fang_Scatter( filepath, searchType ): #在当前路径生成一个散点分布图render.html,散点图纵坐标为price/unitPrice,横坐标为想要查询的字段searchType,需要传入数据路径和查询字段 oridata = pd.read_csv(filepath) if (searchType not in oridata.columns): print('不存在该字段! No Such attribution!') return #字段的单位 unit = {} #非数值数据列表 x_1 = [] x_1.append('direction') x_1.append('rentType') x_1.append('houseType') unit['direction'] = '方向' unit['rentType'] = '整租' unit['houseType'] = '户型' #不干净的数值型数据 x_2 = [] #租房和二手房有不同的价格字段 if ('price' in oridata.columns): x_2.append('price') else: x_2.append('unitPrice') x_2.append('area') x_2.append('viewNum') x_2.append('floor') x_2.append('buildTime') unit['area'] = '平米' unit['viewNum'] = '人' unit['floor'] = '层' unit['price'] = '元/月' unit['unitPrice'] = '元/m2' unit['buildTime'] = '年' for i in x_2: if (i in oridata.columns): oridata[i] = Colum2value(oridata[i]) #xflag标记是否找到查询字段,=1说明在x_1里,为非数值字段,=2在x_2里 xflag = 0 #查找searchType for i in x_1: if i == searchType: xflag = 1 break if xflag == 0: for i in x_2: if i == searchType: xflag = 2 break if xflag == 0: print('没有找到该字段! No Such attribution!') return x = oridata[searchType] y = oridata[x_2[0]] # %% # pyecharts绘图 c = (Scatter().add_xaxis(x).add_yaxis( "price", y, symbol_size=10, label_opts=opts.LabelOpts(is_show=False))) if xflag == 1: #横坐标是类目数据时,改变X轴类型 c.set_global_opts( title_opts=opts.TitleOpts(title=searchType + " with Price"), xaxis_opts=opts.AxisOpts(name=searchType + '/' + unit[searchType], type_="category"), yaxis_opts=opts.AxisOpts(name=x_2[0] + '/' + unit[x_2[0]]), visualmap_opts=opts.VisualMapOpts(max_=60000), datazoom_opts=opts.DataZoomOpts(range_start=0), ) else: c.set_global_opts( title_opts=opts.TitleOpts(title=searchType + " with Price"), xaxis_opts=opts.AxisOpts(name=searchType + '/' + unit[searchType]), yaxis_opts=opts.AxisOpts(name=x_2[0] + '/' + unit[x_2[0]]), visualmap_opts=opts.VisualMapOpts(max_=100000, min_=10000), datazoom_opts=opts.DataZoomOpts(range_start=0), ) c.render()
'江苏': 271, '湖南': 521, '浙江': 724, '海南': 2, '广东': 725, '湖北': 11177, '黑龙江': 121, '澳门': 1, '陕西': 128, '四川': 254, '内蒙古': 3, '重庆': 312, '云南': 6, '贵州': 2, '吉林': 3, '山西': 12, '山东': 259, '福建': 179, '青海': 1, '天津': 1, '其他': 1 } provice = list(province_distribution.keys()) values = list(province_distribution.values()) c = (Map().add("确诊人数", [list(z) for z in zip(provice, values)], "china").set_series_opts(label_opts=opts.LabelOpts( is_show=False)).set_global_opts( title_opts=opts.TitleOpts(title="全国实时疫情分布地图"), visualmap_opts=opts.VisualMapOpts(max_=1000), ))
def map_visualmap(sequence, date) -> Map: c = Map() c.add(date, sequence, maptype="china") c.set_global_opts(title_opts=opts.TitleOpts(title="CBIC:全国各省现存确诊_至4月8号",subtitle="数据来源于丁香园"),legend_opts=opts.LegendOpts(is_show=False),visualmap_opts=opts.VisualMapOpts(is_piecewise=True,\ pieces=pieces_list)) # c = ( # Map() # .add(date, sequence, maptype="china") # .set_global_opts( # title_opts=opts.TitleOpts(title="全国疫情动态地图_确诊累计人数_截至至3月14号"), # visualmap_opts=opts.VisualMapOpts(max_=1400) # ) # ) return c
map.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) map.render('世界疫情(累计确诊).html') """ map1 = Map().add(series_name="世界疫情分布", data_pair=data_list_new, maptype="world", name_map=nameMap, is_map_symbol_show=False ) map1.set_global_opts(title_opts=opts.TitleOpts(title="世界疫情(新增确诊)"), visualmap_opts=opts.VisualMapOpts(max_=58000,is_piecewise=True)) map1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) map1.render('世界疫情(新增确诊).html') """ map2 = Map().add(series_name="世界疫情分布", data_pair=data_list_dead, maptype="world", name_map=nameMap, is_map_symbol_show=False ) map2.set_global_opts(title_opts=opts.TitleOpts(title="世界疫情(死亡)"), visualmap_opts=opts.VisualMapOpts(max_=140000,is_piecewise=True)) map2.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
def candlechart(self,str_tscode=None,subset='masterCandle',dat_cursor=None,MA=[5,10,21], renderfile=False) -> Grid: str_tscode = DataAgent.formatCode(str_tscode) int_chartsize = 500 if str_tscode == False or str_tscode is None: print('invalid sec code provided...') return False dat_cursor = datetime.now().astimezone(timezone(cfg.STR_TIMEZONE)) if dat_cursor is None else dat_cursor closestTradeDate = self.da.int_findClosestTradeDate(datetime.strftime(dat_cursor,'%Y%m%d') ) tpl_dateindex = tuple(str(i) for i in self.da.df_calTbl.loc[self.da.df_calTbl['cal_date'] <= closestTradeDate]['cal_date'][-int_chartsize:] ) # 连接储存对象 if subset=='masterCandle': data_store = libs.tryOpenH5(cfg.H5_FILE_PRE,mode='r') else: data_store = libs.tryOpenH5('{}{}.dat'.format(cfg.H5_FILE_PATH,subset),mode='r') # 初始化交易日表格,作为标准交易日序列join个股交易数据 df_toPlot = data_store['masterCandle'].loc[data_store['masterCandle']['ts_code']==str_tscode] df_dateindex = pd.DataFrame({'trade_caldate': tpl_dateindex}).astype(int) data_store.close() try: str_secname = self.da.df_lookupTbl.loc[self.da.df_lookupTbl['ts_code']==str_tscode]['name'].values[0] str_sectype = self.da.df_lookupTbl.loc[self.da.df_lookupTbl['ts_code']==str_tscode]['sec_type'].values[0] except Exception as e: return libs.log_csv(str_cat='WARNING',str_op='candlechart',str_desc='security code {} does not exist in basic info table...'.format(str_tscode)) str_plotname = '{} - {}'.format(str_tscode,str_secname) # 交易日时间轴标准化,补全停牌日,当日live数据等k线 '''------ 获取实时交易数据部分--------------------''' int_liveDate = self.da.int_findClosestTradeDate(datetime.strftime(datetime.now().astimezone(timezone(cfg.STR_TIMEZONE)),'%Y%m%d') ) if int_liveDate<=closestTradeDate and int_liveDate>df_toPlot['trade_date'].max(): df_liveQuote = self.da.query('quote_now',[self.da.formatCode(str_tscode,False),]) if len(df_liveQuote)>0: df_liveQuote.rename(columns={'open':'adj_open', 'high':'adj_high', 'low':'adj_low', 'price':'adj_close', 'volume':'vol', 'amount':'amount'}, inplace=True) df_liveQuote=df_liveQuote.astype(dtype= {'adj_open':'float','adj_high':'float','adj_low':'float','adj_close':'float','vol':'float','amount':'float'}) df_liveQuote['trade_date'] = int_liveDate df_liveQuote['ts_code'] = str_tscode df_liveQuote['vol'] = df_liveQuote['vol']/100 if str_sectype==1 or str_tscode[:3]=='399' else df_liveQuote['vol'] df_liveQuote['amount'] = df_liveQuote['amount']/1000 df_toPlot = df_toPlot.append(df_liveQuote[['ts_code','trade_date','adj_open','adj_high','adj_low','adj_close','vol','amount']],sort=False) '''------ 结束 获取实时交易数据部分--------------------''' df_toPlot = pd.merge(df_dateindex, df_toPlot, left_on='trade_caldate', right_on='trade_date', how='left') df_toPlot['close'].fillna(method='ffill',inplace=True) df_toPlot['ts_code'].fillna(method='ffill',inplace=True) df_toPlot['klineSML'].fillna('NNNN',inplace=True) df_toPlot['adj_close'].fillna(method='ffill',inplace=True) df_toPlot['vol'].fillna(value=0,inplace=True) df_toPlot['amount'].fillna(value=0,inplace=True) df_toPlot['open'].fillna(df_toPlot['close'],inplace=True) df_toPlot['high'].fillna(df_toPlot['close'],inplace=True) df_toPlot['low'].fillna(df_toPlot['close'],inplace=True) df_toPlot['adj_open'].fillna(df_toPlot['adj_close'],inplace=True) df_toPlot['adj_high'].fillna(df_toPlot['adj_close'],inplace=True) df_toPlot['adj_low'].fillna(df_toPlot['adj_close'],inplace=True) self.kchartdf = df_toPlot #输出至可访问对象属性中 '''-----------------画图部分---------------------''' lst_ohlcv=df_toPlot.loc[:,['adj_open','adj_close','adj_low','adj_high']].values.tolist() lst_vol=list(df_toPlot['vol'].values) lst_amount=list(df_toPlot['amount'].values) lst_peaks=list(abs(df_toPlot['peaks'].values)) # lst_pivotdown=[float('nan') if i<0 else i for i in list(df_toPlot['pivots'].values)] lst_pivotdown=[float('nan') if i<0 else i for i in list(df_toPlot['valid_pivots'].values)] # lst_pivotup=[float('nan') if i>0 else abs(i) for i in list(df_toPlot['pivots'].values)] lst_pivotup=[float('nan') if i>0 else abs(i) for i in list(df_toPlot['valid_pivots'].values)] lst_xaxis=list(df_toPlot['trade_caldate'].astype(str)) def calculate_ma(day_count: int, d): result: List[Union[float, str]] = [] for i in range(len(d)): if i < day_count: result.append("-") continue sum_total = 0.0 for j in range(day_count): sum_total += float(d[i - j][1]) result.append(abs(float("%.3f" % (sum_total / day_count)))) return result kline = (Kline() .add_xaxis(lst_xaxis) .add_yaxis(series_name=str_secname, y_axis=lst_ohlcv, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(type_="min",value_dim="close"), opts.MarkPointItem(type_="max",value_dim="close")], symbol_size = [20, 20], #表示标记宽为 20,高为 10 ), itemstyle_opts=opts.ItemStyleOpts( color="#ec0000", color0="#00da3c", border_color="#ec0000", border_color0="#00da3c", ),) .set_global_opts( title_opts=opts.TitleOpts( title=str_plotname, subtitle='MA='+str(MA), ), 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, pos_top='10%', pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0,1,2], range_start=75, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0,1,2], type_="slider", pos_top="90%", range_start=75, 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",font_size=10), ), # 阴量绿阳量红 visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=list(map(lambda x: x+len(MA),[4,5])), #动态算出vol和amt柱状图的series index 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", ), ) ) trendline = ( Line() .add_xaxis(lst_xaxis) .add_yaxis('高低点', lst_peaks, itemstyle_opts=opts.ItemStyleOpts(color="green")) ) for i in MA: if i is not None: trendline.add_yaxis( series_name='MA'+str(i), y_axis=calculate_ma(day_count=i, d=lst_ohlcv), is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ) trendline.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) trendline.set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) keyPoints = ( EffectScatter() .add_xaxis(lst_xaxis) .add_yaxis("末跌高", lst_pivotdown,symbol=SymbolType.ARROW,symbol_rotate=180,symbol_size=5,itemstyle_opts=opts.ItemStyleOpts(color="purple")) .add_yaxis("末升低", lst_pivotup,symbol=SymbolType.ARROW,symbol_size=5,itemstyle_opts=opts.ItemStyleOpts(color="blue")) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) ) vol_bar = ( Bar() .add_xaxis(lst_xaxis) .add_yaxis( series_name="交易量", yaxis_data=[ [i, lst_vol[i], 1 if lst_ohlcv[i][0] < lst_ohlcv[i][1] else -1] for i in range(len(lst_vol)) ], 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_="最低", max_="最高", ), 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), ) # .add_yaxis("交易量", lst_vol,itemstyle_opts=opts.ItemStyleOpts(color="#456A76")) ) amnt_bar = ( Bar() .add_xaxis(lst_xaxis) .add_yaxis( series_name="交易额", yaxis_data=[ [i, lst_amount[i], 1 if lst_ohlcv[i][0] < lst_ohlcv[i][1] else -1] for i in range(len(lst_amount)) ], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=2, 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_="最低", max_="最高", ), 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), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), ) # .add_yaxis("交易额", lst_amount,itemstyle_opts=opts.ItemStyleOpts(color="#456A76")) ) priceChart = kline.overlap(trendline).overlap(keyPoints) gridChart = Grid() gridChart.add( priceChart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_bottom='40%'), ) gridChart.add( vol_bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="60%", height='15%'), ) gridChart.add( amnt_bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="75%"), ) fname = '{}{}.html'.format(cfg.PATH_ANAFILE,'kline') gridChart.render(fname) if renderfile else None self.kchart = gridChart # 将结果输出到analytics对象属性中用于function以外的调用 return self
def map(self, area=None): """ 话题地理分布 :param area: 限制区域,默认为中国 :return: """ if self.maparea: if not area or self.maparea == area: self.load(QUrl('file:///' + dirname + '/qt/buffer/map.html')) self.flag = 4 return if not area: area = 'china' self.maparea = area topicset = self.topic.find() temp = {} for topic in topicset: for item in topic['entity']['Ns']: if self.maparea == 'china': city = self.get_province(''.join(item[0])) else: city = self.get_city(''.join(item[0]), self.maparea) if city: if city not in temp: temp[city] = 0 temp[city] += item[1] data = [] for key, value in temp.items(): data.append([key, value]) if self.maparea == 'china': temparea = '中国' else: temparea = self.maparea max_value = 100 if temp.values(): max_value = max(temp.values()) map = ( Map() .add("话题分布", data, self.maparea) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="话题分布-" + temparea), visualmap_opts=opts.VisualMapOpts(max_=max_value), ) ) html = map.render_embed() html_id = re.search('div id="(.*?)"', html).group(1) html = re.sub(r'width:\d+px', 'width:100%', html) # JavaScript代码注入,实现点击地图获取点击区域 js = '''<script> new QWebChannel(qt.webChannelTransport, function (channel) { window.map = channel.objects.map; }); chart_html_id.on('click', function(params){ area = params.name; map.map_click(area); }); document.onclick = function(e){ ctx = e.target.getContext('2d') data = ctx.getImageData(e.pageX,e.pageY,1,1).data if (data[3] == 0) { map.map_click('china') } } </script>''' qwebchanneljs = '<script type="text/javascript" src="qwebchannel.js"></script>' html = re.sub('</head>', qwebchanneljs + '</head>', html) html = re.sub('</body>', js + '</body>', html) html = re.sub('html_id', html_id, html) with open(dirname + '/qt/buffer/map.html', 'w') as f: f.write(html) self.load(QUrl('file:///' + dirname + '/qt/buffer/map.html')) self.flag = 4