python – 当散景条图上的缩放级别变化时,是否可以保持相同数量
发布时间:2020-12-20 13:06:55 所属栏目:Python 来源:网络整理
导读:我正在使用Django并使用数据库中的数据生成散景条图.我在下面放了一个基本代码示例.我正在从datetime变量生成x轴刻度标签,以便在每小时使用日期时间格式化的字符串进行刻度.这会导致所有刻度标签始终可见.放大时很好但缩小时不漂亮,因为标签位于彼此之上. 有
我正在使用Django并使用数据库中的数据生成散景条图.我在下面放了一个基本代码示例.我正在从datetime变量生成x轴刻度标签,以便在每小时使用日期时间格式化的字符串进行刻度.这会导致所有刻度标签始终可见.放大时很好但缩小时不漂亮,因为标签位于彼此之上.
有没有办法让散景自动调整哪些刻度标签可见,因为缩放级别变化以保持恒定数量的刻度标签可见? views.py: # -*- coding: utf-8 -*- from django.shortcuts import render from bokeh.plotting import * from bokeh.resources import CDN from bokeh.embed import components from bokeh.charts import Bar from bokeh.models import Range1d from collections import OrderedDict import datetime def plot_1_bar(data,y,y_lab,title,xlab,ylab,yrange,palette): x0_list_str = [] y_list = [] # x_axis_type == "datetime": i_x = 'x1' i_y = y[0] for idx,val in enumerate(data): x0_list_str.append(val[i_x].strftime("%Y-%m-%d %H h")) y_list.append(val[i_y]) data_x = x0_list_str data_y = OrderedDict() data_y[y_lab[0]] = y_list plot = Bar(data_y,data_x,title=title,xlabel=xlab,ylabel=ylab,stacked=True,continuous_range=yrange,palette=palette,legend=True,height=400) return components(plot,CDN) def plot1(request): script_bokeh = "" div_bokeh = "" data = [] data.append({'x1': datetime.datetime(2015,1,8,0),'y1': 0}) data.append({'x1': datetime.datetime(2015,9,10,11,12,'y1':8}) data.append({'x1': datetime.datetime(2015,13,'y1':12}) data.append({'x1': datetime.datetime(2015,14,'y1':0}) data.append({'x1': datetime.datetime(2015,15,16,17,18,'y1':2}) data.append({'x1': datetime.datetime(2015,19,'y1':6}) data.append({'x1': datetime.datetime(2015,20,'y1':4}) data.append({'x1': datetime.datetime(2015,21,'y1':22}) data.append({'x1': datetime.datetime(2015,22,'y1':36}) data.append({'x1': datetime.datetime(2015,23,'y1':32}) data.append({'x1': datetime.datetime(2015,2,'y1':21}) data.append({'x1': datetime.datetime(2015,'y1':15}) data.append({'x1': datetime.datetime(2015,3,4,5,6,'y1':45}) data.append({'x1': datetime.datetime(2015,7,'y1':47}) data.append({'x1': datetime.datetime(2015,'y1':52}) data.append({'x1': datetime.datetime(2015,'y1':44}) data.append({'x1': datetime.datetime(2015,'y1':0}) script_bokeh,div_bokeh = plot_1_bar(data,['y1'],['y legend label'],"",'x label','y label',Range1d(0,70),['red']) return render(request,'tests/plot1.html',{'script_bokeh': script_bokeh,'div_bokeh': div_bokeh}) plot1.html: <!DOCTYPE html> <html lang="en"> <head> <title>bokeh bar plot</title> <link rel="stylesheet" type="text/css" href="/static/tests/css/bokeh-0.9.2.min.css" /> <script src="/static/tests/js/bokeh-0.9.2.min.js" type="text/javascript"></script> </head> <body> <h1>Bokeh bar plot</h1> <div id="div_graph">{{div_bokeh|safe}}{{script_bokeh|safe}}</div> </body> </html> 解决方法
首先,bokeh.charts API(包括Bar)在2017年已弃用并删除,不应使用.稳定且受支持的bokeh.plotting API现在可用于创建多种分类和条形图,并且比bokeh.charts更强大.有关完整代码的许多实例,请参见用户指南第
Handling Categorical Data章
没有内置的自动收报机可以配置为执行此操作,并且没有任何CustomJSTicker(尚未)所以,现在要做这样的事情你将不得不求助于custom extension.此外,你将需要CustomJS回调范围,该集合根据您所需的策略配置自定义代码.这是一个完整的脚本,显示了一种可能的方法(此代码使用Bokeh 0.12.16进行测试): from bokeh.core.properties import Int from bokeh.models import CategoricalTicker,CustomJS from bokeh.io import show from bokeh.plotting import figure class MyTicker(CategoricalTicker): __implementation__ = """ import {CategoricalTicker} from "models/tickers/categorical_ticker" import * as p from "core/properties" export class MyTicker extends CategoricalTicker type: "MyTicker" @define { nth: [ p.Int,1 ] } get_ticks: (start,end,range,cross_loc) -> ticks = super(start,cross_loc) ticks.major = ticks.major.filter((element,index) => index % this.nth == 0) return ticks """ nth = Int(default=1) fruits = ['Apples','Pears','Nectarines','Plums','Grapes','Strawberries'] p = figure(x_range=fruits,plot_height=250,title="Fruit Counts",tools="xwheel_zoom") p.vbar(x=fruits,top=[5,6],width=0.9) p.xgrid.grid_line_color = None p.y_range.start = 0 p.xaxis.ticker = MyTicker(nth=1) cb = CustomJS(args=dict(ticker=p.xaxis[0].ticker),code=""" if (Math.abs(cb_obj.start-cb_obj.end) > 8) { ticker.nth = 2 } else { ticker.nth = 1 } """) p.x_range.js_on_change('start',cb) p.x_range.js_on_change('end',cb) show(p) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |