Как я могу изменить направление цветной панели Plotly, чтобы маленькие значения вверху и большие значения внизу

В настоящее время я использую цветную полосу на plotly, чтобы указать глубины, на которых были размещены подводные приемники SONAR. В настоящее время цветная полоса выглядит так:

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

Код, который я использовал для создания графика и цветовой полосы, состоит из двух словарей (один задает данные, другой задает макет).

import plotly.offline as off
import _tkinter

from matplotlib import pyplot as plt
from matplotlib import ticker
from matplotlib.dates import drange

...

data = [ 
   dict(
        lat = lat_array,
        lon = lon_array,
        marker = dict(
            color = log_depth_array,
            size = 6,
            colorbar = dict(
                title = 'Log Depth',
                thickness = 10,
                titleside = "right",
                outlinecolor = "rgba(68, 68, 68, 0)",
                ticks = "outside",
                ticklen = 3,
                showticksuffix = "last",
                ticksuffix = " log(meters, 10)",
                dtick = .1
            ),
        ),
        mode = 'markers',
        text = mouseover_text,
        type = 'scattergeo'
    ) ]

layout = dict(
    geo = dict(
        showframe = True,
        framewidth = 25,
        scope = 'north america',
        showland = True,
        landcolor = "rgb(212, 212, 212)",
        showocean = True,
        oceancolor = "rgb(200, 255, 255)",
        subunitcolor = "rgb(0,0,0)",
        resolution = 50,
        projection = dict(
            type = 'robinson',
            rotation = dict(
                lon = -100
            )
        ),
        lonaxis = dict(
            showgrid = True,
            gridwidth = 0.5,
            range= [ lon_min-.4, lon_max+.4 ],
            dtick = 5
        ),
        lataxis = dict (
            showgrid = True,
            gridwidth = 0.5,
            range= [ lat_min-.4, lat_max+.4 ],
            dtick = 5
        )
    ),
)
fig = { 'data':data, 'layout':layout }
off.iplot(fig)

Какой аргумент я должен добавить (возможно, в словарь цветовой полосы в словаре данных), чтобы числа, представляющие большую глубину, находились внизу цветовой полосы?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете изменить цветовую шкалу, затем жестко запрограммировать тиквалы, передав tickvals = [1, 1.1, ... 3.4], и сделать тиктекст противоположным: ticktext = ['3.4', '3.3', ... '1']. Это также потребует от вас вручную добавить текст " log(meters, 10)" к самой верхней галочке.

Я не уверен, почему, но есть странное поведение, когда тиквалы и тиктекст обрезаются сверху и снизу — вам может потребоваться настроить некоторые начальные и конечные значения тиков. Возможно, это связано с отступами по умолчанию для цветовых полос, или, возможно, я что-то пропустил.

import plotly.offline as off
import _tkinter

from matplotlib import pyplot as plt
from matplotlib import ticker
from matplotlib.dates import drange

import numpy as np
import pandas as pd

# use some sample data
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv')
lat_array, lon_array = df['lat'], df['long']
lat_min, lon_min = min(lat_array), min(lon_array)
lat_max, lon_max = max(lat_array), max(lon_array)
np.random.seed(42)
log_depth_array = np.random.uniform(0,3.3,size=len(df))

tickvals = np.arange(1-0.2,3.5,0.1)
ticktext = [str(f"{val:.1f}") for val in tickvals[::-1]]
ticktext[-3] = ticktext[-3] + " log(meters, 10)"

data = [ 
   dict(
        lat = lat_array,
        lon = lon_array,
        marker = dict(
            color = log_depth_array,
            colorscale = 'viridis_r',
            size = 6,
            colorbar = dict(
                title = 'Log Depth',
                # colorscale = "viridis_r",
                thickness = 10,
                titleside = "right",
                outlinecolor = "rgba(68, 68, 68, 0)",
                ticks = "outside",
                tickmode = "array",
                tickvals = tickvals,
                ticktext = ticktext,
                ticklen = 3,
            ),
        ),
        mode = 'markers',
        # text = mouseover_text,
        type = 'scattergeo'
    ) ]

layout = dict(
    geo = dict(
        showframe = True,
        framewidth = 25,
        scope = 'north america',
        showland = True,
        landcolor = "rgb(212, 212, 212)",
        showocean = True,
        oceancolor = "rgb(200, 255, 255)",
        subunitcolor = "rgb(0,0,0)",
        resolution = 50,
        projection = dict(
            type = 'robinson',
            rotation = dict(
                lon = -100
            )
        ),
        lonaxis = dict(
            showgrid = True,
            gridwidth = 0,
            range= [ lon_min-.4, lon_max+.4 ],
            dtick = 5
        ),
        lataxis = dict (
            showgrid = True,
            gridwidth = 0,
            range= [ lat_min-.4, lat_max+.4 ],
            dtick = 5
        )
    ),
)
fig = { 'data':data, 'layout':layout }
off.iplot(fig)

Дополнение к ответу @Derek O: перезапись значений галочки была правильным решением, за исключением того, что теперь цветовая шкала неправильно отражает точки данных. Если точка имела значение 1,2, значение тика для 1,2 будет перезаписано чем-то совершенно другим, например, 3,4. Уловка, которую я использовал, чтобы обойти это, заключалась в следующем:

  1. Создайте список значений тиков, используя -1 * фактические значения данных

  2. Переопределите эти отрицательные метки с их отрицательными значениями (двойное отрицание)

  3. Подайте на цветовую полосу массив отрицательных значений данных (-1*data_array)

         tickvals = np.arange(-0.8,-3.5,-0.1) #uses known min/max of data_array
         ticktext = [str(f"{-1*val:.1f}") for val in tickvals]
    
         data = [ dict(
             lat = selected['lat'],
             lon = selected['lon'],
             marker = dict(
                 color = -1*data_array,
    

Другие вопросы по теме