Python 带bokeh面积图的分类轴 问题:
当前是否可以将分类轴与bokehPython 带bokeh面积图的分类轴 问题:,python,bokeh,Python,Bokeh,当前是否可以将分类轴与bokehArea图表一起使用 细节 我正在尝试使用高级bokeh.chartsAPI绘制一个带有分类x轴的面积图 例子 如果设置bokeh和这样的数据帧: import numpy import pandas from bokeh import charts, plotting, models plotting.output_notebook() _, blue, _, green = bokeh.palettes.Paired4 datalist = [ {
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)
我得到:
及
我试过的
但如果我对面积图也这么做:
area = charts.Area(data=data, y='rain', x='month', stack=True,
color=blue, width=600, height=300)
plotting.show(area)
我得到:
其他努力
删除x
的显式定义会显示区域,但会显示一个数字轴(0-12)
将
x\u范围指定为列表或bokeh.models.ranges.FactorRange
似乎没有效果(有或没有x='month'
)。一个选项是为轴制作自定义刻度标签。根据此处的答案修改-:
首先,我们导入并创建一个字典来存储修改后的标签(使用Jupyter笔记本):
现在我们定义自定义标签类(以及相关的JS代码):
并使用修改后的轴绘制图表:
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)
这是我得到的最后一个情节:
谢谢你的回答。看起来这行得通,但我会把问题留长一点。还有,有没有想过如何让所有的月份都像散点图一样出现?不用担心。我将更新我的答案,以包括一个自定义的股票代码,这样您就可以显示所有月份(月份之间没有中间的滴答声)。
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_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)