Bokeh中的相关图问题

4 投票
1 回答
735 浏览
提问于 2025-04-18 09:31

当我通过 rect() (来自Bokeh库)绘制我的数据时,我在可视化中只看到一条水平的块状线。我的数据打印出来是正确的,按照我所知道的格式也没问题(用 type() 验证过,它们都是列表)。有没有人能帮我诊断一下这个问题?如果问题不在这里,我可以再提供更多代码。

(如果需要的话:我在Ubuntu 14.04上运行Python 2.7.6)

    from bokeh.plotting import *
    from bokeh.objects import HoverTool, ColumnDataSource
    output_notebook()

    #All the same color just for testing
    colors = [
   "#191919", "#191919", "#191919", "#191919", "#191919", 
    "#191919", "#191919", "#191919", "#191919", "#191919",
    "#191919", "#191919", "#191919", "#191919", "#191919",
    "#191919", "#191919", "#191919", "#191919", "#191919", 
    "#191919", "#191919", "#191919", "#191919", "#191919"
    ]

    x_2 = []
    for i in trans_dat: x_2.append(i)

    y_2 = []
    for i in trans_dat.index: y_2.append(i)

    colors_2 = []
    kwordxstate_2 = []
    for y in y_2:
        for x in x_2:
            kword_state = trans_dat[x][y]
            kwordxstate_2.append(kword_state)
            colors_2.append(colors[kword_state])

    source = ColumnDataSource(
        data = dict(
            x_2=x_2,
            y_2=y_2,
            colors_2=colors_2,
            kwordxstate_2=kwordxstate_2,  
        )
    )

    rect(x_2, y_2, 1,1, source=source,
         x_range=x_2, y_range=y_2,
         color=colors_2, line_color=None,
         tools="resize,hover,previewsave", title="Keywords by state",
         plot_width=900, plot_height=400)

    grid().grid_line_color = None
    axis().axis_line_color = None
    axis().major_tick_line_color = None
    axis().major_label_text_font_size = "10pt"
    axis().major_label_standoff = 0
    xaxis().location = "top"
    xaxis().major_label_orientation = np.pi/3

    show()

1 个回答

5

好的,我需要一个完整的例子,里面有一些典型的 trans_dat,这样我才能进一步分析。不过,这里有一些可能对你有帮助的通用建议:

x_rangey_range 应该是一个没有重复项的类别列表,按照你希望在坐标轴上显示的顺序排列。

xy 应该是你想要绘制的每个矩形的分类坐标。xy 的长度应该是一样的。

我觉得你同时传入 x_2y_2 用于类别列表和坐标,这点有点奇怪。这通常是个错误。

假设你有以下类别:

  • x轴: ["美国", "加拿大"]

  • y轴: ["科技", "农业"]

这些可以作为 x_rangey_range 的输入。但如果你想为每种组合都绘制一个矩形,那么你需要像这样传入 xy

  • x: ["美国", "美国", "加拿大", "加拿大"]

  • y: ["科技", "农业", "科技", "农业"]

这样就会生成四个矩形,每对类别对应一个。如果你想省略某些组合,也没问题:

  • x: ["美国", "美国", "加拿大"]

  • y: ["科技", "农业", "农业"]

这样就不会有 ("加拿大", "科技") 这个坐标的矩形了。

这和数字的情况类似:我们可能有 x 和 y 轴的范围分别是 [0,10] 和 [1,2]。但是 坐标 是从这两个范围的乘积中得出的,比如 (0, 1.5) 或 (5.5, 2)。

这样是不是更清楚地区分了范围参数(即可能的类别列表)和坐标参数(即你想要绘制图形的类别组合)?如果你需要更多信息,请告诉我。

撰写回答