代码之家  ›  专栏  ›  技术社区  ›  OD1995

使bokeh绘图散点的颜色和标记依赖于数据帧值

  •  0
  • OD1995  · 技术社区  · 6 年前

    我一直在玩bokeh,以便得到一个交互式散点图,工具提示和交互式图例等。

    目前,我可以设置颜色的点使用的值,在熊猫数据框后面的绘图栏。不过,我想知道是否也可以设置标记类型(菱形、圆形、正方形等),使用数据框中的另一列?

    我很感激这将意味着你需要一个双重传奇,但希望这不会是一个太大的问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   bigreddot    5 年前

    从bokeh 1.0开始,可以使用 marker_map 和CDS过滤器:

    from bokeh.plotting import figure, show, output_file
    from bokeh.sampledata.iris import flowers
    from bokeh.transform import factor_cmap, factor_mark
    
    SPECIES = ['setosa', 'versicolor', 'virginica']
    MARKERS = ['hex', 'circle_x', 'triangle']
    
    p = figure(title = "Iris Morphology", background_fill_color="#fafafa")
    p.xaxis.axis_label = 'Petal Length'
    p.yaxis.axis_label = 'Sepal Width'
    
    p.scatter("petal_length", "sepal_width", source=flowers, legend="species", 
              fill_alpha=0.4, size=12,
              marker=factor_mark('species', MARKERS, SPECIES),
              color=factor_cmap('species', 'Category10_3', SPECIES))
    
    show(p)
    

    enter image description here


    旧答案

    从博克开始 0.13.0 将标记类型直接从数据参数化仍然是一个开放的功能请求: #5884 Create Marker class that encompasses all markers and allow specific marker type to be specified from data

    在实现之前,你最好利用 CDSView models 要在多个glyph方法中拆分单个数据集,请执行以下操作:

    from bokeh.plotting import figure, show
    from bokeh.models import ColumnDataSource, CDSView, GroupFilter
    from bokeh.sampledata.iris import flowers
    
    source = ColumnDataSource(flowers)
    
    setosa = CDSView(source=source, filters=[GroupFilter(column_name='species', group='setosa')])
    versicolor = CDSView(source=source, filters=[GroupFilter(column_name='species', group='versicolor')])
    virginica = CDSView(source=source, filters=[GroupFilter(column_name='species', group='virginica')])
    
    p = figure()
    
    p.circle(x='petal_length', y='petal_width', source=source, view=setosa,
             size=10, color='red', alpha=0.6, legend='setosa')
    
    p.square(x='petal_length', y='petal_width', source=source, view=versicolor,
             size=10, color='green', alpha=0.6, legend='versicolor')
    
    p.triangle(x='petal_length', y='petal_width', source=source, view=virginica,
               size=10, color='blue', alpha=0.6, legend='virginica')
    
    p.legend.location = "top_left"
    show(p)
    

    enter image description here