Как я могу редактировать метки осей в графическом графике? - PullRequest
2 голосов
/ 20 марта 2019

Чтобы привести простой пример, скажем, мы строим следующий кадр данных с галочками нечисловых осей:

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-тики: enter image description here

Я хочу преобразовать его в сюжетную фигуру.

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)

Это графикиследующий интерактивный рисунок, скриншот которого я показываю ниже: enter image description here

Как видно, теперь 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: Прямо сейчас, единственный найденный мной обходной путь - это сначала построить фиктивную диаграмму рассеяния с -

  1. похожая цветовая карта (например, по крайней мере, на мой взгляд, эквивалент coolwarm для matplotlib, похоже, RdBu),
  2. аналогичный диапазон значений, которые будутна оси Y (например, от 1000 до 11000), чтобы обеспечить правильное отображение границ цветовой шкалы, и
  3. заголовки осей, если они вам нужны.

Примерно так:

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

enter image description here

А затем обновите трассировку фигуры реальными данными, после чего будут правильно сформированы метки осей и цветовая полоса:

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

enter image description here

Но это не должно быть таким запутанным.Не говоря уже о том, что в реальных случаях я бы не знал фактических значений x и y для обновления фиктивного графа, поэтому я рисую их в matplotlib (поскольку библиотека, которая создает эти графики, была разработана для построения matplotlib).только цифры), а затем преобразовать их в сюжет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...