对于一个项目,我有一个非常大的数据文件(超过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。如果此链接有效,请随时查看。 如您所见,它确实很小,几乎没有用。我希望具有变焦功能的散景能够提供更好的效果。
对不起,如果我问一些愚蠢的事情。我对编程总体并不熟悉,而是想自己学习。
答案 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",
...
}
您可能希望以编程方式生成该字典。但是尽管如此,我还是要说这种方法有一些根本性的问题。如果您允许用户一直缩小,则刻度标签将相互碰撞并重叠。您可以在绘图范围上设置bounds
和max_interval
,这可能会减轻这种情况。
总体而言,我实际上建议尝试完全找到其他可视化方法,因为我认为这种方法不适合任何库或工具中的1000x1000情况。