Чтобы привести простой пример, скажем, мы строим следующий кадр данных с галочками нечисловых осей:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.cm import coolwarm
data = {'Col1':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
'Col2':['1000', '2000', '3000', '4000', '5000', '6000', '7000', '8000', '9000', '10000']}
df = pd.DataFrame(data, columns=['Col1', 'Col2'])
fig, ax = plt.subplots()
s = ax.scatter(df.Col1, df.Col2, c=df.Col2, cmap=coolwarm)
plt.colorbar(s)
На этом рисунке показан следующий рисунок.Можно увидеть нечисловые x- и y-тики:
Я хочу преобразовать его в сюжетную фигуру.
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import plotly.tools as tls
plotly_fig = tls.mpl_to_plotly(fig)
init_notebook_mode(connected=True)
iplot(plotly_fig)
Это графикиследующий интерактивный рисунок, скриншот которого я показываю ниже:
Как видно, теперь x- и y-метки заменены фиктивными числовыми значениями.(И цветовая полоса полностью отсутствует, но это проблема для другого дня).
Чтобы добавить правильные метки осей на графике, я сначала просматриваю "data"
часть plotly_fig
:
plotly_fig["data"][0]
Scatter({
'marker': {'color': [rgba(58,76,192,1.0), rgba(92,123,229,1.0),
rgba(130,165,251,1.0), rgba(170,198,253,1.0),
rgba(205,217,236,1.0), rgba(234,211,199,1.0),
rgba(246,183,156,1.0), rgba(240,141,111,1.0),
rgba(217,88,71,1.0), rgba(179,3,38,1.0)],
'line': {'color': [rgba(58,76,192,1.0), rgba(92,123,229,1.0),
rgba(130,165,251,1.0), rgba(170,198,253,1.0),
rgba(205,217,236,1.0), rgba(234,211,199,1.0),
rgba(246,183,156,1.0), rgba(240,141,111,1.0),
rgba(217,88,71,1.0), rgba(179,3,38,1.0)],
'width': 1.0},
'size': 6.0,
'symbol': 'circle'},
'mode': 'markers',
'uid': '2a0dfe88-4ae4-11e9-8fcc-8c164500f4c6',
'x': [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0],
'xaxis': 'x',
'y': [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0],
'yaxis': 'y'
})
Мывидно, что plotly_fig["data"][0]["x"]
и plotly_fig["data"][0]["y"]
оба установлены на [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
.Поэтому я подумал, что их редактирования будет достаточно:
plotly_fig['data'][0]['x'] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
plotly_fig['data'][0]['y'] = ['1000', '2000', '3000', '4000', '5000', '6000', '7000', '8000', '9000', '10000']
Но это ничего не изменило - оно все еще отображает метки с пустыми осями.
Как это исправить?
РЕДАКТИРОВАТЬ 1: Теперь, глядя на plotly_fig["data"][0]
, я обнаружил, что plotly_fig["data"][0]["x"]
и plotly_fig["data"][0]["y"]
не появляются с кавычками, окружающими их значения:
Scatter({
'marker': {'color': [rgba(58,76,192,1.0), rgba(92,123,229,1.0),
rgba(130,165,251,1.0), rgba(170,198,253,1.0),
rgba(205,217,236,1.0), rgba(234,211,199,1.0),
rgba(246,183,156,1.0), rgba(240,141,111,1.0),
rgba(217,88,71,1.0), rgba(179,3,38,1.0)],
'line': {'color': [rgba(58,76,192,1.0), rgba(92,123,229,1.0),
rgba(130,165,251,1.0), rgba(170,198,253,1.0),
rgba(205,217,236,1.0), rgba(234,211,199,1.0),
rgba(246,183,156,1.0), rgba(240,141,111,1.0),
rgba(217,88,71,1.0), rgba(179,3,38,1.0)],
'width': 1.0},
'size': 6.0,
'symbol': 'circle'},
'mode': 'markers',
'uid': '2a0dfe88-4ae4-11e9-8fcc-8c164500f4c6',
'x': [A, B, C, D, E, F, G, H, I, J],
'xaxis': 'x',
'y': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000],
'yaxis': 'y'
})
При более глубоком погружении кажется, что они являются кортежами, а не списками, как я их ввел:
plotly_fig['data'][0]['x']
>>> ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J')
plotly_fig['data'][0]['y']
>>> ('1000',
'2000',
'3000',
'4000',
'5000',
'6000',
'7000',
'8000',
'9000',
'10000')
Не поэтому метки осей не меняются?Если да, как это исправить?
РЕДАКТИРОВАТЬ 2: Прямо сейчас, единственный найденный мной обходной путь - это сначала построить фиктивную диаграмму рассеяния с -
- похожая цветовая карта (например, по крайней мере, на мой взгляд, эквивалент
coolwarm
для matplotlib, похоже, RdBu
), - аналогичный диапазон значений, которые будутна оси Y (например, от 1000 до 11000), чтобы обеспечить правильное отображение границ цветовой шкалы, и
- заголовки осей, если они вам нужны.
Примерно так:
import numpy as np
import plotly.graph_objs as go
z=np.random.randint(1000, 11000, size=20)
trace=dict(type='scatter',
x=3+np.random.rand(20),
y=-2+3*np.random.rand(20),
mode='markers',
marker=dict(color= z,
colorscale='RdBu', size=14, colorbar=dict(thickness=20)))
axis_style=dict(zeroline=False, showline=True, mirror=True)
layout=dict(width=600, height=450,
xaxis=axis_style,
yaxis=axis_style,
hovermode='closest')
fig=go.FigureWidget(data=[trace], layout=layout)
fig
А затем обновите трассировку фигуры реальными данными, после чего будут правильно сформированы метки осей и цветовая полоса:
trace.update(dict(x=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
y=['1000', '2000', '3000', '4000', '5000', '6000', '7000', '8000', '9000', '10000']
)
)
fig=go.FigureWidget(data=[trace], layout=layout)
fig
Но это не должно быть таким запутанным.Не говоря уже о том, что в реальных случаях я бы не знал фактических значений x и y для обновления фиктивного графа, поэтому я рисую их в matplotlib (поскольку библиотека, которая создает эти графики, была разработана для построения matplotlib).только цифры), а затем преобразовать их в сюжет.