Гистограмма с одной стопкой с пользовательской градиентной окраской - PullRequest
1 голос
/ 29 октября 2019

Here's what I came up with by plotting thick line segments.

Вот что я придумал, построив отрезки толстых линий. Окраска синего цвета, с разной альфа, 0 <альфа <1. </p>

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

Кроме того, я обнаружил, что весы matplotlib забавны. Не должно быть перекрытия столбцов, но если я отрегулирую размер окна, зазор между отрезками линии изменится. This is the same figure as the earlier one, just after I've resized the figure window with my mouse. Это тот же показатель, что и ранее, сразу после того, как яизменил размер окна рисунка с помощью мыши.

Я не уверен, есть ли лучший способ сделать это или есть другой пакет, который я могу использовать. Вот фрагмент кода, который я использую.

import matplotlib.pyplot as plt
x1  =[0, 19, 39, 46, 60, 79]
x2 = [19, 39, 46, 60, 79, 90]
alpha_list = [-0.8402, -0.6652, 0.0, -0.5106, -0.8074, 0.0]
plt.figure()
for idx,x in enumerate(x1):
    plt.plot([x1[idx],x2[idx]],[0,0],color = 'blue',alpha=alpha_list[idx],linewidth =20)
plt.show()

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Полагаю, альфа - это просто обходной путь для использования разных оттенков синего? В этом случае можно использовать цветовую карту Blues.
Несколько линий могут быть построены с использованием LineCollection.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

x1  =[0, 19, 39, 46, 60, 79]
x2 = [19, 39, 46, 60, 79, 90]
alpha_list = [-0.8402, -0.6652, 0.0, -0.5106, -0.8074, 0.0]

verts = np.dstack((np.c_[x1, x2], np.zeros((len(x1), 2))))

fig, ax = plt.subplots()
lc = LineCollection(verts, linewidth=40, cmap="Blues_r", array=np.array(alpha_list))
ax.add_collection(lc)

ax.autoscale()
ax.set_ylim(-1,1)
fig.colorbar(lc)
plt.show()

enter image description here

0 голосов
/ 29 октября 2019

Я думаю, что обходной путь должен был бы использовать plt.barh. Вот пример использования нормализованных цветовых карт. Каждый цвет преобразуется в RGBA, прежде чем он может быть передан в plt.barh.

import matplotlib.pyplot as plt
from matplotlib import colors
import matplotlib.cm as cmx

x1  =[0, 19, 39, 46, 60, 79]
x2 = [19, 39, 46, 60, 79, 90]

values = range(len(x1))
jet = cm = plt.get_cmap('jet') 
cNorm  = colors.Normalize(vmin=0, vmax=values[-1])
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)

fig, ax = plt.subplots()

for idx, x, y in zip(values,x1, x2):          
    colorVal = scalarMap.to_rgba(values[idx])  
    start = x
    end = y
    width=end-start
    ax.barh(y = 0, width = width, left=start, height = 0.1, label = str(idx), color=colorVal)         
ax.set_ylim(-.5,0.5)
ax.legend()

, который возвращает: enter image description here

Если вы действительно хотите просто изменитьальфа-прозрачность одного цвета, вам просто нужно будет ввести alpha_list[idx] для последнего элемента в кортеж RGBA colorVal. По какой-то причине RGBA не нравились отрицательные альфа-значения, поэтому обратите внимание, что я изменил их все на положительные

fig, ax = plt.subplots()
alpha_list = [0.8402, 0.6652, 0.01, 0.5106, 0.8074, 0.0]
for idx, x, y in zip(values,x1, x2):          
    colorVal = (0.0, 0.3, 1.0, alpha_list[idx])
    start = x
    end = y
    width=end-start
    ax.barh(y = 0, width = width, left=start, height = 0.1, label = str(idx), color=colorVal)         


ax.set_ylim(-.5,0.5)
ax.legend()

enter image description here

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