В настоящее время я использую цветную полосу на 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)
Какой аргумент я должен добавить (возможно, в словарь цветовой полосы в словаре данных), чтобы числа, представляющие большую глубину, находились внизу цветовой полосы?
Вы можете изменить цветовую шкалу, затем жестко запрограммировать тиквалы, передав 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*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,