加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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>

x axis zoomed in

x axis zoomed out

解决方法

首先,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)

enter image description here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读