График Matplotlib с переменной шириной линии

Можно ли построить линию с переменной шириной линии в matplotlib? Например:

from pylab import * x = [1, 2, 3, 4, 5] y = [1, 2, 2, 0, 0] width = [.5, 1, 1.5, .75, .75] plot(x, y, linewidth=width) 

Это не работает, потому что ширина линии ожидает скаляр.

  • Matplotlib tight_layout () не учитывает цифру suptitle
  • Двойное событие, зарегистрированное щелчком мыши, если легенда находится за пределами осей
  • данные о рассеянном участке не отображаются на континентах в базовой карте «молоток»
  • python / matplotlib - многоцветная линия
  • Могу ли я перебирать стили линий в matplotlib
  • Художник Matplotlib должен оставаться того же размера при увеличении, но ТАКЖЕ перемещаться с панорамированием?
  • Примечание. Я знаю о * fill_between () * и * fill_betweenx () *. Поскольку они заполняют только x или y, это не оправдывает случаев, когда у вас есть наклонная линия. Желательно, чтобы заливка всегда была нормальной к линии. Вот почему запрашивается переменная ширина.

  • Matplotlib Backend Различия между Agg и Cairo
  • Как я могу показать цифры отдельно в matplotlib?
  • Как снова получить интерактивные сюжеты в Spyder / IPython / matplotlib?
  • Повторная выборка нерегулярно разнесенных данных в регулярную сетку в Python
  • Невозможно переместить окно графика Matplotlib и выйти из него с помощью кнопки красного X
  • Как увеличить окно plt.show () с помощью Python
  • 4 Solutions collect form web for “График Matplotlib с переменной шириной линии”

    Используйте LineCollections. Способ сделать это в соответствии с этим примером Matplotlib

     from matplotlib.collections import LineCollection x=linspace(0,4*pi,10000) y=cos(x) lwidths=1+x[:-1] points = np.array([x, y]).T.reshape(-1, 1, 2) segments = np.concatenate([points[:-1], points[1:]], axis=1) lc = LineCollection(segments, linewidths=lwidths,color='blue') fig,a = plt.subplots() a.add_collection(lc) a.set_xlim(0,4*pi) a.set_ylim(-1.1,1.1) fig.show() 

    вывод

    Альтернатива ответу Джулио Гирардо, который разделяет линии в сегментах, вы можете использовать встроенную функцию разворота matplotlib, которые строят линию, используя вместо этого круги:

     from matplotlib import pyplot as plt import numpy as np x = np.linspace(0,10,10000) y = 2 - 0.5*np.abs(x-4) lwidths = (1+x)**2 # scatter 'o' marker size is specified by area not radius plt.scatter(x,y, s=lwidths, color='blue') plt.xlim(0,9) plt.ylim(0,2.1) plt.show() 

    По моему опыту я нашел две проблемы с разделением линии на сегменты:

    1. По какой-то причине сегменты всегда делятся на очень тонкие белые линии. Цвета этих линий смешиваются с цветами сегментов при использовании очень большого количества сегментов. Из-за этого цвет линии не совпадает с цветом.

    2. Он не очень хорошо справляется с очень резкими разрывами.

    Вы можете построить каждый сегмент линии отдельно, с отдельной шириной линии, что-то вроде:

     from pylab import * x = [1, 2, 3, 4, 5] y = [1, 2, 2, 0, 0] width = [.5, 1, 1.5, .75, .75] for i in range(len(x)-1): plot(x[i:i+2], y[i:i+2], linewidth=width[i]) show() 

    Ответ gg349 работает красиво, но режет линию на многие части, что часто может создавать плохой рендеринг.

    Вот альтернативный пример, который генерирует непрерывные линии, когда ширина однородна:

     import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots(1) xs = np.cos(np.linspace(0, 8 * np.pi, 200)) * np.linspace(0, 1, 200) ys = np.sin(np.linspace(0, 8 * np.pi, 200)) * np.linspace(0, 1, 200) widths = np.round(np.linspace(1, 5, len(xs))) def plot_widths(xs, ys, widths, ax=None, color='b', xlim=None, ylim=None, **kwargs): if not (len(xs) == len(ys) == len(widths)): raise ValueError('xs, ys, and widths must have identical lengths') fig = None if ax is None: fig, ax = plt.subplots(1) segmentx, segmenty = [xs[0]], [ys[0]] current_width = widths[0] for ii, (x, y, width) in enumerate(zip(xs, ys, widths)): segmentx.append(x) segmenty.append(y) if (width != current_width) or (ii == (len(xs) - 1)): ax.plot(segmentx, segmenty, linewidth=current_width, color=color, **kwargs) segmentx, segmenty = [x], [y] current_width = width if xlim is None: xlim = [min(xs), max(xs)] if ylim is None: ylim = [min(ys), max(ys)] ax.set_xlim(xlim) ax.set_ylim(ylim) return ax if fig is None else fig plot_widths(xs, ys, widths) plt.show() 
    Python - лучший язык программирования в мире.