如何从bokeh中的邻接矩阵重新创建使用matplotlib制作的颜色图

时间:2019-05-10 19:40:03

标签: python matplotlib bokeh adjacency-matrix colormap

对于一个项目,我有一个非常大的数据文件(超过1000人),说明人们如何看待彼此。 它是一个方矩阵,在x和y轴上都有所有人员的姓名。如果在x和y轴上都包含同一个人的情况下查看该值,则该值为1。对于其他所有人,此人将显示0到1或0之间的值。 我已经在matplotlib中创建了它,但是我对结果不满意(它太小且不具有交互性),因此我尝试切换到bokeh。 但是,我对bokeh不太熟悉,无法自己重新创建它。

对于为bokeh扩展所做的代码,我试图看一下bokeh画廊提供的示例:http://bokeh.pydata.org/en/latest/docs/gallery/les_mis.html

这就是我想要的方式,但我只是不理解。

因此,使用matplotlib显示颜色图的当前代码为:

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt 

# Read in csv
df = pandas.read_csv('file1.csv', sep=';', index_col=0)

plt.imshow(df.T, aspect='auto', cmap='bwr')

#add the values
for(i, j), value in np.ndenumerate(matrix):
    plt.text(i, j, "%.3f"%value, va='center', ha='center')

plt.axis('off')
plt.show()


print(df)

目前,这是结果。很显然,我无法显示图片,因为这是我的第一篇博文,而且我是新手。 https://imgur.com/Y4RDxMx。如果此链接有效,请随时查看。 如您所见,它确实很小,几乎没有用。我希望具有变焦功能的散景能够提供更好的效果。

对不起,如果我问一些愚蠢的事情。我对编程总体并不熟悉,而是想自己学习。

1 个答案:

答案 0 :(得分:0)

对于1000x1000的情况,您肯定不是不是要模拟您发布的链接。发送所有坐标并渲染一百万个单独的矩形比Bokeh或您的浏览器可以处理的更多。您将需要colormap an image,它效率更高。但是,随后获得有用的轴将需要更多的工作。您可以使用SingleIntervalTicker仅在特定位置生成刻度线,例如如果您将图片的边界设置为(-0.5,999.5),则

p.yaxis.ticker = SingleIntervalTicker(interval=1, num_minor_ticks=0)
p.yaxis.ticker = SingleIntervalTicker(interval=1, num_minor_ticks=0)

将在图像的每个“单元”的中心生成一个刻度。然后要打印名称而不是数字,可以使用刻度标签覆盖:

p.xaxis.major_label_overrides = p.xaxis.major_label_overrides = {
    0: "some name",
    1: "other name",
    ...
}

您可能希望以编程方式生成该字典。但是尽管如此,我还是要说这种方法有一些根本性的问题。如果您允许用户一直缩小,则刻度标签将相互碰撞并重叠。您可以在绘图范围上设置boundsmax_interval,这可能会减轻这种情况。

总体而言,我实际上建议尝试完全找到其他可视化方法,因为我认为这种方法不适合任何库或工具中的1000x1000情况。