我正在尝试在 plotly 上制作带注释的热图。
import plotly.plotly as py
import plotly.tools as tls
from plotly.graph_objs import *
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('masterc.csv')
locations = {}
anno = []
for i in range(df.shape[0]):
locations.setdefault((df.iat[i,2],df.iat[i,6]),0)
locations[(df.iat[i,2],df.iat[i,6])]+=df.iat[i,8]
x1 = []
y1 = []
z1 = []
z1_text = []
for key in locations.keys():
if key[0] not in x1:
x1 += [key[0],]
if key[1] not in y1:
y1 += [key[1],]
for y in y1:
dummy = []
for x in x1:
if (x,y) in locations.keys():
dummy += [locations[(x,y)],]
else:
dummy += [0,]
z1 += [dummy,]
data = z1
arr = np.array(data)
fig, ax = plt.subplots()
ax.imshow(data, cmap='seismic')
for (i, j), z in np.ndenumerate(data):
ax.text(j, i, '{:f}'.format(z), ha='center', va='center')
ax.set_xticklabels(x1, rotation=90)
ax.set_yticklabels(y1)
#plt.show()
py.plot_mpl(fig)
我收到以下警告
Warning (from warnings module):
File "C:\Python27\lib\site-packages\plotly\matplotlylib\renderer.py", line 394
warnings.warn("Aw. Snap! You're gonna have to hold off on "
UserWarning: Aw. Snap! You're gonna have to hold off on the selfies for now. Plotly can't import images from matplotlib yet!
最后出现以下错误
Traceback (most recent call last):
File "E:\Project Kumbh\heatmap with annotations.py", line 58, in <module>
py.plot_mpl(fig)
File "C:\Python27\lib\site-packages\plotly\plotly\plotly.py", line 261, in plot_mpl
return plot(fig, **plot_options)
File "C:\Python27\lib\site-packages\plotly\plotly\plotly.py", line 155, in plot
figure = tools.return_figure_from_figure_or_data(figure_or_data, validate)
File "C:\Python27\lib\site-packages\plotly\tools.py", line 1409, in return_figure_from_figure_or_data
if not figure['data']:
KeyError: 'data'
有没有办法解决这个错误?或者有什么简单的方法可以在 plotly 上制作带注释的热图?
最佳答案
编辑
现在可以使用 plotly.figure_factory
轻松完成:
https://plot.ly/python/annotated_heatmap/
据我所知,仍然无法将 Matplotlib 的热图转换为 Plotly 的热图。
2015 年 8 月 回答
这是使用 python api 制作带注释的热图的示例:
import plotly.plotly as py
import plotly.graph_objs as go
x = ['A', 'B', 'C', 'D', 'E']
y = ['W', 'X', 'Y', 'Z']
# x0 x1 x2 x3 x4
z = [[0.00, 0.00, 0.75, 0.75, 0.00], # y0
[0.00, 0.00, 0.75, 0.75, 0.00], # y1
[0.75, 0.75, 0.75, 0.75, 0.75], # y2
[0.00, 0.00, 0.00, 0.75, 0.00]] # y3
annotations = go.Annotations()
for n, row in enumerate(z):
for m, val in enumerate(row):
annotations.append(go.Annotation(text=str(z[n][m]), x=x[m], y=y[n],
xref='x1', yref='y1', showarrow=False))
colorscale = [[0, '#3D9970'], [1, '#001f3f']] # custom colorscale
trace = go.Heatmap(x=x, y=y, z=z, colorscale=colorscale, showscale=False)
fig = go.Figure(data=go.Data([trace]))
fig['layout'].update(
title="Annotated Heatmap",
annotations=annotations,
xaxis=go.XAxis(ticks='', side='top'),
yaxis=go.YAxis(ticks='', ticksuffix=' '), # ticksuffix is a workaround to add a bit of padding
width=700,
height=700,
autosize=False
)
print py.plot(fig, filename='Stack Overflow 31756636', auto_open=False) # https://plot.ly/~theengineear/5179
结果在 https://plot.ly/~theengineear/5179
链接一个相关的 GitHub 问题:https://github.com/plotly/python-api/issues/273
关于matplotlib - 如何在 plotly 上绘制带注释的热图?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31756636/