gpt4 book ai didi

python - 带有 Bokeh 面积图的分类轴

转载 作者:行者123 更新时间:2023-11-28 18:29:21 27 4
gpt4 key购买 nike

问题

目前是否可以将分类轴与 Bokeh Area 图表一起使用?

详情

我正在尝试使用高级 bokeh.charts API 绘制带有分类 x 轴的面积图。

例子

如果像这样设置 Bokeh 和数据框:

import numpy
import pandas
from bokeh import charts, plotting, models
plotting.output_notebook()

_, blue, _, green = bokeh.palettes.Paired4

datalist = [
{'month': 'Oct', 'rain': 107., 'snow': 0.0, 'wy_month': 0},
{'month': 'Nov', 'rain': 23.6, 'snow': 0.8, 'wy_month': 1},
{'month': 'Dec', 'rain': 31.9, 'snow': 30.5, 'wy_month': 2},
{'month': 'Jan', 'rain': 44.6, 'snow': 31.1, 'wy_month': 3},
{'month': 'Feb', 'rain': 49.6, 'snow': 31.7, 'wy_month': 4},
{'month': 'Mar', 'rain': 13.6, 'snow': 4.2, 'wy_month': 5},
{'month': 'Apr', 'rain': 107.2, 'snow': 1.6, 'wy_month': 6},
{'month': 'May', 'rain': 77.0, 'snow': 0.0, 'wy_month': 7},
{'month': 'Jun', 'rain': 108., 'snow': 0.0, 'wy_month': 8},
{'month': 'Jul', 'rain': 216., 'snow': 0.0, 'wy_month': 9},
{'month': 'Aug', 'rain': 76.8, 'snow': 0.0, 'wy_month': 10},
{'month': 'Sep', 'rain': 76.4, 'snow': 0.0, 'wy_month': 11},
]

data = pandas.DataFrame(datalist)

我能做到:

bar = charts.Bar(data=data, values='rain', label='month',
color=[blue], width=600, height=300)
plotting.show(bar)

scatter = charts.Scatter(data=data, x='month', y='rain',
color=[blue], width=600, height=300)
plotting.show(scatter)

我得到:

bars

scatter

我尝试过的

但是如果我对面积图做同样的事情:

area = charts.Area(data=data, y='rain', x='month', stack=True,
color=blue, width=600, height=300)
plotting.show(area)

我得到:

enter image description here

其他努力

删除 x 的显式定义会使区域显示出来,但带有数字轴 (0 - 12)。

area = charts.Area(data=data, y='rain', stack=True,
color=blue, width=600, height=300)

x_range 指定为列表或 bokeh.models.ranges.FactorRange 似乎没有效果(有和没有 x='month')。

最佳答案

一种选择是为您的轴制作自定义刻度标签。从这里的答案修改 - How do I use custom labels for ticks in Bokeh? :

首先我们进行导入并创建一个字典来存储我们修改后的标签(使用 Jupyter notebook):

import numpy
import pandas
from bokeh import charts, plotting, models
import bokeh
from bokeh.models.formatters import TickFormatter, String, List, Dict, Int
from bokeh.models import FixedTicker
plotting.output_notebook()

_, blue, _, green = ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c']

datalist = [
{'month': 'Oct', 'rain': 107., 'snow': 0.0, 'wy_month': 0},
{'month': 'Nov', 'rain': 23.6, 'snow': 0.8, 'wy_month': 1},
{'month': 'Dec', 'rain': 31.9, 'snow': 30.5, 'wy_month': 2},
{'month': 'Jan', 'rain': 44.6, 'snow': 31.1, 'wy_month': 3},
{'month': 'Feb', 'rain': 49.6, 'snow': 31.7, 'wy_month': 4},
{'month': 'Mar', 'rain': 13.6, 'snow': 4.2, 'wy_month': 5},
{'month': 'Apr', 'rain': 107.2, 'snow': 1.6, 'wy_month': 6},
{'month': 'May', 'rain': 77.0, 'snow': 0.0, 'wy_month': 7},
{'month': 'Jun', 'rain': 108., 'snow': 0.0, 'wy_month': 8},
{'month': 'Jul', 'rain': 216., 'snow': 0.0, 'wy_month': 9},
{'month': 'Aug', 'rain': 76.8, 'snow': 0.0, 'wy_month': 10},
{'month': 'Sep', 'rain': 76.4, 'snow': 0.0, 'wy_month': 11},

]

data = pandas.DataFrame(datalist)
label_data = {x['wy_month']:x['month'] for x in datalist}

现在我们定义自定义标签类(和关联的 JS 代码):

JS_CODE =  """
_ = require "underscore"
Model = require "model"
p = require "core/properties"
class FixedTickFormatter extends Model
type: 'FixedTickFormatter'
doFormat: (ticks) ->
labels = @get("labels")
return (labels[tick] ? "" for tick in ticks)
@define {
labels: [ p.Any ]
}
module.exports =
Model: FixedTickFormatter
"""

class FixedTickFormatter(TickFormatter):

labels = Dict(Int, String, help="""
A mapping of integer ticks values to their labels.
""")

__implementation__ = JS_CODE

并用修改后的坐标轴绘制图表:

area = charts.Area(data=data, y='rain', x='wy_month', stack=True,
color=blue, width=600, height=300)
area.xaxis[0].formatter = FixedTickFormatter(labels=label_data)
area.xaxis[0].ticker = FixedTicker(ticks=sorted(label_data.keys()))
plotting.show(area)

这是我得到的最终情节:

Bokeh area plot

关于python - 带有 Bokeh 面积图的分类轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38733308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com