Пользовательские маркеры на основе значений переменных - PullRequest
0 голосов
/ 05 июля 2018

Я использую следующий код для создания простой линейной диаграммы в Python. У меня есть две переменные (внизу кода):

ctime
amount

ctime, просто используя текущее время для каждого элемента в количестве; есть 10 раз сумма состоит из сумм в диапазоне от 0 до 1000; десять сумм

Я хочу покрасить маркеры своего графика следующим образом:

сумма меньше 300; этот конкретный маркер для этого значения будет зеленым сумма составляет от 300 до 400; этот конкретный маркер для этого значения будет желтым сумма больше 400; этот конкретный маркер для этого значения будет красным

Можно ли как-нибудь встроить обработчик условного типа для этого?

layout = Layout(
    title='Current Amount',
    titlefont=Font(
        family='"Open sans", verdana, arial, sans-serif',
        size=17,
        color='#444'
    ),
    font=Font(
        family='"Open sans", verdana, arial, sans-serif',
        size=12,
        color='#444'
    ),
    showlegend=True,
    autosize=True,
    width=803,
    height=566,
    xaxis=XAxis(
        title='Time',
        titlefont=Font(
            family='"Open sans", verdana, arial, sans-serif',
            size=14,
            color='#444'
        ),
        range=[1418632334984.89, 1418632334986.89],
        domain=[0, 1],
        type='date',
        rangemode='normal',
        autorange=True,
        showgrid=False,
        zeroline=False,
        showline=True,
        autotick=True,
        nticks=0,
        ticks='inside',
        showticklabels=True,
        tick0=0,
        dtick=1,
        ticklen=5,
        tickwidth=1,
        tickcolor='#444',
        tickangle='auto',
        tickfont=Font(
            family='"Open sans", verdana, arial, sans-serif',
            size=12,
            color='#444'
        ),
        mirror='allticks',
        linecolor='rgb(34,34,34)',
        linewidth=1,
        anchor='y',
        side='bottom'
    ),
    yaxis=YAxis(
        title='GHI (W/m2)',
        titlefont=Font(
            family='"Open sans", verdana, arial, sans-serif',
            size=14,
            color='#444'
        ),
        range=[-5.968375815056313, 57.068375815056314],
        domain=[0, 1],
        type='linear',
        rangemode='normal',
        autorange=True,
        showgrid=False,
        zeroline=False,
        showline=True,
        autotick=True,
        nticks=0,
        ticks='inside',
        showticklabels=True,
        tick0=0,
        dtick=1,
        ticklen=5,
        tickwidth=1,
        tickcolor='#444',
        tickangle='auto',
        tickfont=Font(
            family='"Open sans", verdana, arial, sans-serif',
            size=12,
            color='#444'
        ),
        exponentformat='B',
        showexponent='all',
        mirror='allticks',
        linecolor='rgb(34,34,34)',
        linewidth=1,
        anchor='x',
        side='left'
    ),
    legend=Legend(
        x=1,
        y=1.02,
        traceorder='normal',
        font=Font(
            family='"Open sans", verdana, arial, sans-serif',
            size=12,
            color='#444'
        ),
        bgcolor='rgba(255, 255, 255, 0.5)',
        bordercolor='#444',
        borderwidth=0,
        xanchor='left',
        yanchor='auto'
    )
)


new_data = Scatter(x=ctime, y=amount)
data = Data( [ new_data ] )

1 Ответ

0 голосов
/ 05 июля 2018

Таким образом, для вашего случая использования вам необходимо использовать свойство marker.color под линейной диаграммой, которое указано в официальной документации как.

цвет (цвет)
Устанавливает цвет маркера. Он принимает либо определенный цвет, либо массив чисел, которые отображаются на шкала цветов относительно максимальных и минимальных значений массива или относительной cmin и cmax, если установлено.

Подробнее здесь

Ниже приведен простой рабочий пример, демонстрирующий ваш вариант использования, пожалуйста, примените его к вашему решению и дайте мне знать, если ваша проблема решена.

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs,init_notebook_mode,plot,iplot
init_notebook_mode(connected=True)

x = [1,2,3,4,5,6,7,8,9]
y = [100,200,300,400,500,600,700,800,900]

# function below sets the color based on amount
def SetColor(x):
    if(x < 300):
        return "green"
    elif(x >= 300 | x <= 400):
        return "yellow"
    elif(x > 400):
        return "red"

# Create a trace
trace = go.Scatter(
    x = x,
    y = y,
    marker = dict(color=list(map(SetColor, y)))
)

iplot([trace], filename='basic-line')

Выход:

enter image description here

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