Cmap ж / линейный сюжет.Может быть построен под линией (но сплошной) или градиентом (но над линией) - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь решить проблему визуализации, основанную на наборе данных, обработанном пандами и matplotlib.Я нанес данные на график.Моя цель состоит в том, чтобы область под кривой была градиентной с помощью cmap (например, «плазмы»)

Однако обе мои лучшие попытки неверны по разным причинам.Первый цвет будет градиентным, но только по линии.Второй будет окрашиваться под линией, но только сплошным цветом.Я застрял очень долго ... Спасибо!

ax = plot_chance_death.plot(kind='line', x = 'State', y = 'Percent Chance', 
ax=ax, color='indigo')
l1 = ax.lines[0]
x1 = l1.get_ydata()
y1 = l1.get_xdata()
fig, ax = plt.subplots()

# plot only the outline of the polygon, and capture the result
poly, = ax.fill(x1, y1, facecolor='none')

# get the extent of the axes
xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()

# create a dummy image
img_data = np.arange(ymin,ymax,(ymax-ymin)/100.)
img_data = img_data.reshape(img_data.size,1)

# plot and clip the image
im = ax.imshow(img_data, aspect='auto',  origin='upper', cmap='plasma', 
extent=[xmin,xmax,ymin,ymax], vmin=1., vmax=y1.max())

#this shows the gradient but above the line
im.set_clip_path(poly)

###this solution colors underneath but solid color
ax.fill_between(x1, y1, y2=0, cmap='plasma',  norm=(0,.5))

Link to Image Here

1 Ответ

0 голосов
/ 23 мая 2018

Имеет смысл включить нижнюю часть области для использования в качестве clip_path в Path.Вы можете создать Path из plot данных и затем добавить к нему две нижние точки.

import pandas as pd
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
from matplotlib.path import Path

df = pd.DataFrame({"x" : np.linspace(0,0.05,40),
                   "y" : np.cumsum(np.random.rand(40))[::-1]*3})


fig, ax = plt.subplots()


l, = ax.plot(df.x, df.y, color="k")

# get the extent of the axes
xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()

# create a dummy image
img_data = np.arange(ymin,ymax,(ymax-ymin)/100.)
img_data = img_data.reshape(img_data.size,1)

# plot and clip the image
im = ax.imshow(img_data, aspect='auto',  origin='upper', cmap='plasma', 
               extent=[xmin,xmax,ymin,ymax], vmin=1., vmax=df.y.max())

px,py = l.get_data()

p0 = [[px[-1], py.min()], [px[0], py.min()]]
p = np.concatenate((np.c_[px,py],p0))
path = Path(p)

im.set_clip_path(path, transform=ax.transData)

plt.show()

enter image description here

...