Понимание matplotlib verts

Я пытаюсь создать пользовательские маркеры в matplotlib для диаграммы разброса, где маркеры представляют собой прямоугольники с фиксированной высотой и различной шириной. Ширина каждого маркера зависит от значения y. Я пробовал это так, используя этот код в качестве шаблона и предполагая, что если verts задан список N 2-D кортежей, он отображает прямоугольники с шириной сопоставимого первого значения и высотой второго (возможно, это уже неправильно, но как же еще я это выполню?).

У меня есть список значений x и y, каждый из которых содержит углы в градусах. Затем я вычисляю ширину и высоту каждого маркера на

field_size = 2. symb_vec_x = [(field_size / np.cos(i * np.pi / 180.)) for i in y] symb_vec_y = [field_size for i in range(len(y))] 

и постройте список verts и запишите все с помощью

 symb_vec = list(zip(symb_vec_x, symb_vec_y)) fig = plt.figure(1, figsize=(14.40, 9.00)) ax = fig.add_subplot(1,1,1) sc = ax.scatter(ra_i, dec_i, marker='None', verts=symb_vec) 

Но полученный участок пуст, но сообщение об ошибке отсутствует. Может ли кто-нибудь сказать мне, что я сделал неправильно с определением верт и как это сделать правильно? Благодаря!

2 Solutions collect form web for “Понимание matplotlib verts”

Как уже упоминалось, «marker =« Нет »необходимо удалить, то подходящий способ указать прямоугольник с вершинами – это что-то вроде

 verts = list(zip([-10.,10.,10.,-10],[-5.,-5.,5.,5])) ax.scatter([0.5,1.0],[1.0,2.0], marker=(verts,0)) 

Вершины определяются как ([x1,x2,x3,x4],[y1,y2,y3,y4]) поэтому необходимо обратить внимание на то, что получают минусовые знаки и т. Д.

Это (verts, 0) упоминается в документах как

Для обратной совместимости также принимается форма ( verts , 0), но она эквивалентна просто verts для предоставления необработанного набора вершин, которые определяют форму.

Однако я считаю, что использование только verts не дает правильной формы.

Чтобы автоматизировать процесс, вам нужно сделать что-то вроде

 v_val=1.0 h_val=2.0 verts = list(zip([-h_val,h_val,h_val,-h_val],[-v_val,-v_val,v_val,v_val])) 

Основной пример:

 import pylab as py ax = py.subplot(111) v_val=1.0 h_val=2.0 verts = list(zip([-h_val,h_val,h_val,-h_val],[-v_val,-v_val,v_val,v_val])) ax.scatter([0.5,1.0],[1.0,2.0], marker=(verts,0)) 

введите описание изображения здесь *

редактировать

Индивидуальные маркеры

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

 import pylab as py ax = py.subplot(111) def verts_function(x,y,r): # Define the vertex's multiplying the x value by a ratio x = x*r y = y return [(-x,-y),(x,-y),(x,y),(-x,y)] n=5 for i in range(1,4): ax.scatter(i,i, marker=(verts_function(i,i,0.3),0)) py.show() 

введите описание изображения здесь

поэтому в моем простом случае я рисую точки i, i и рисую прямоугольники вокруг них. Маркер vert не является интуитивным (я уверен, что есть основная логика, но я не могу найти подходящую документацию). Кажется, что вершины зависят от отношения x и y, а не от фактического числового значения, поэтому следующие эквиваленты

 vert = [(-300.0, -1000), (300.0, -1000), (300.0, 1000), (-300.0, 1000)] vert = [(-0.3, -1), (0.3, -1), (0.3, 1), (-0.3, 1)] 

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

Все это становится очень сложным, я уверен, что должен быть лучший способ сделать это.

Я получил решение от Райана из списка рассылки пользователей matplotlib. Это довольно элегантно, поэтому я расскажу о его примере здесь:

 import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Rectangle from matplotlib.collections import PatchCollection n = 100 # Get your xy data points, which are the centers of the rectangles. xy = np.random.rand(n,2) # Set a fixed height height = 0.02 # The variable widths of the rectangles widths = np.random.rand(n)*0.1 # Get a color map and make some colors cmap = plt.cm.hsv colors = np.random.rand(n)*10. # Make a normalized array of colors colors_norm = colors/colors.max() # Here's where you have to make a ScalarMappable with the colormap mappable = plt.cm.ScalarMappable(cmap=cmap) # Give it your non-normalized color data mappable.set_array(colors) rects = [] for p, w in zip(xy, widths): xpos = p[0] - w/2 # The x position will be half the width from the center ypos = p[1] - height/2 # same for the y position, but with height rect = Rectangle( (xpos, ypos), w, height ) # Create a rectangle rects.append(rect) # Add the rectangle patch to our list # Create a collection from the rectangles col = PatchCollection(rects) # set the alpha for all rectangles col.set_alpha(0.3) # Set the colors using the colormap col.set_facecolor( cmap(colors_norm) ) # No lines col.set_linewidth( 0 ) #col.set_edgecolor( 'none' ) # Make a figure and add the collection to the axis. fig = plt.figure() ax = fig.add_subplot(111) ax.add_collection(col) # Add your ScalarMappable to a figure colorbar fig.colorbar(mappable) plt.show() 

Спасибо, Райан, и все, кто внес свои идеи!

  • Python matplotlib изменяет цвет по умолчанию для значений, превышающих диапазон цветовых штрихов
  • Как построить линию сетки только с помощью pcolor / pcolormesh
  • Есть ли только 4 стили линии Matplotlib?
  • Сохранение нескольких фигур matplotlib с многопроцессорной обработкой
  • Класс периодических осей в matplotlib?
  • Matplotlib цветной фон и расположение меток
  • matplotlib colorbar чередующиеся верхние нижние метки
  • Вставка метки matplotlib inset_axis имеет метки меток, перекрывающие родительские оси
  • Как настроить поведение бэкэнда Qt4Agg?
  • Сохранение наложения карт между графиками в matplotlib
  • Как «отключить» размытый эффект imshow () в matplotlib?
  • Python - лучший язык программирования в мире.