Создание цветовой полосы для графика, сделанного с помощью plt.fill

Я новичок в Python (раньше был пользователем IDL), поэтому я надеюсь, что я прошу об этом понятным образом. Я пытаюсь создать полярный график с x количеством ящиков, где данные в бункере усредняются и заданы цвет, связанный с этим значением. Это, похоже, отлично работает при использовании команды plt.fill, где я могу определить ячейку, а затем цвет заливки. Проблема возникает, когда я пытаюсь сделать цветную полоску для этого. Я продолжаю получать ошибки, указывающие AttributeError: объект «Рисунок» не имеет атрибута «autoscale_None»

Любые советы были бы полезны.

import matplotlib.pyplot as plt import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.cm as cm from matplotlib.pyplot import figure, show, rc, grid import pylab r = np.arange(50)/5. rstep = r[1] - r[0] theta = np.arange(50)/50.*2.*np.pi tstep = theta[1] - theta[0] colorv = np.arange(50)/50. # force square figure and square axes looks better for polar, IMO width, height = mpl.rcParams['figure.figsize'] size = min(width, height) # make a square figure fig = figure(figsize=(size, size)) ax = fig.add_axes([0.1, 0.1, .8, .8])#, polar=True) my_cmap = cm.jet for j in range(len(r)): rbox = np.array([r[j], r[j], r[j]+ rstep, r[j] + rstep]) for i in range(len(theta)): thetabox = np.array([theta[i], theta[i] + tstep, theta[i] + tstep, theta[i]]) x = rbox*np.cos(thetabox) y = rbox*np.sin(thetabox) plt.fill(x,y, facecolor = my_cmap(colorv[j])) # Add colorbar, make sure to specify tick locations to match desired ticklabels cbar = fig.colorbar(fig, ticks=[np.min(colorv), np.max(colorv)]) cb = plt.colorbar() plt.show() 

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

 r = np.arange(50)/50.*7. + 3. rstep = r[1] - r[0] theta = np.arange(50)/50.*1.5*np.pi - np.pi tstep = theta[1] - theta[0] colorv = np.sin(r/10.*np.pi) # force square figure and square axes looks better for polar, IMO width, height = mpl.rcParams['figure.figsize'] size = min(width, height) # make a square figure fig = figure(figsize=(size, size)) ax = fig.add_axes([0.1, 0.1, .8, .8])#, polar=True) my_cmap = cm.jet for j in range(len(r)): rbox = np.array([r[j], r[j], r[j]+ rstep, r[j] + rstep]) for i in range(len(theta)): thetabox = np.array([theta[i], theta[i] + tstep, theta[i] + tstep, theta[i]]) x = rbox*np.cos(thetabox) y = rbox*np.sin(thetabox) plt.fill(x,y, facecolor = my_cmap(colorv[j])) # Add colorbar, make sure to specify tick locations to match desired ticklabels #cbar = fig.colorbar(fig, ticks=[np.min(colorv), np.max(colorv)]) #cb = plt.colorbar() plt.show() 

И затем с зацеплением …

от matplotlib.mlab import griddata

 r = np.arange(50)/5. rstep = r[1] - r[0] theta = np.arange(50)/50.*1.5*np.pi - np.pi tstep = theta[1] - theta[0] colorv = np.sin(r/10.*np.pi) # force square figure and square axes looks better for polar, IMO width, height = mpl.rcParams['figure.figsize'] size = min(width, height) # make a square figure fig = figure(figsize=(size, size)) ax = fig.add_axes([0.1, 0.1, .8, .8])#, polar=True) my_cmap = cm.jet x = r*np.cos(theta) y = r*np.sin(theta) X,Y = np.meshgrid(x,y) data = griddata(x,y,colorv,X,Y) cax = plt.contourf(X,Y, data) plt.colorbar() # Add colorbar, make sure to specify tick locations to match desired ticklabels #cbar = fig.colorbar(fig, ticks=[np.min(colorv), np.max(colorv)]) #cb = plt.colorbar() plt.show() 

2 Solutions collect form web for “Создание цветовой полосы для графика, сделанного с помощью plt.fill”

colorbar требует, чтобы вещи были экземпляром ScalarMappable , чтобы сделать из них цветную панель.

Поскольку вы вручную устанавливаете каждую плиту, нет ничего, что по существу имеет цветную панель.

Существует несколько способов подделать его из вашей цветовой карты, но в этом случае есть гораздо более простое решение.

pcolormesh делает именно то, что вы хотите, и будет намного быстрее.

В качестве примера:

 import numpy as np import matplotlib.pyplot as plt # Linspace makes what you're doing _much_ easier (and includes endpoints) r = np.linspace(0, 10, 50) theta = np.linspace(0, 2*np.pi, 50) fig = plt.figure() ax = fig.add_subplot(111, projection='polar') # "Grid" r and theta into 2D arrays (see the docs for meshgrid) r, theta = np.meshgrid(r, theta) cax = ax.pcolormesh(theta, r, r, edgecolors='black', antialiased=True) # We could just call `plt.colorbar`, but I prefer to be more explicit # and pass in the artist that I want it to extract colors from. fig.colorbar(cax) plt.show() 

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

Или, если вы предпочитаете неполярные оси, как в вашем примере кода:

 import numpy as np import matplotlib.pyplot as plt r = np.linspace(0, 10, 50) theta = np.linspace(0, 2*np.pi, 50) # "Grid" r and theta and convert them to cartesian coords... r, theta = np.meshgrid(r, theta) x, y = r * np.cos(theta), r * np.sin(theta) fig = plt.figure() ax = fig.add_subplot(111) ax.axis('equal') cax = ax.pcolormesh(x, y, r, edgecolors='black', antialiased=True) fig.colorbar(cax) plt.show() 

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

Примечание. Если вы предпочитаете, чтобы граничные линии были немного менее темными, просто укажите linewidth=0.5 или что-то похожее на pcolormesh .

Наконец, если вы хотите прямо сделать цветную панель из цветового кода в исходном коде, вы должны создать экземпляр ScalarMappable из него и передать это в colorbar . Это проще, чем кажется, но это немного много.

Например, в исходном коде, если вы выполните следующие действия:

 cax = cm.ScalarMappable(cmap=my_cmap) cax.set_array(colorv) fig.colorbar(cax) 

Он должен делать то, что вы хотите.

Поэтому я нашел обходное решение. Поскольку я знаю регион, в котором у меня определенно не будет данных, я там заговорил. Я убедился, что данные охватывают весь спектр того, что я заливаю. Затем я прикрываю его (этот район все равно будет закрыт, он показывает, где находится «земля»). Теперь я могу пойти и использовать plt.fill, как и раньше, и использовать цветную панель из случайно загруженных данных. Я знаю, что это не правильный путь, но он работает и не пытается интерполировать мои данные.

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

 hid = plt.pcolormesh(X,Y, data, antialiased=True) #here we cover up the region that we just plotted in r3 = [1 for i in range(360)] theta3 = np.arange(360)*np.pi/180. plt.fill(theta3, r3, 'w') #now we can go through and fill in all the regions for j in range(len(r)): rbox = np.array([r[j], r[j], r[j]+ rstep, r[j] + rstep]) for i in range(len(theta)): thetabox = np.array([theta[i], theta[i] + tstep, theta[i] + tstep, theta[i]]) x = rbox*np.cos(thetabox) y = rbox*np.sin(thetabox) colorv = np.sin(r[j]/10.*np.pi) plt.fill(thetabox,rbox, facecolor = my_cmap(colorv)) #And now we can plot the color bar that fits the data Tada :) plt.colorbar() plt.show() 

Вывод кода выше

  • matplotlib получить значения ylim
  • Визуализация статистики данных Mongodb с использованием matplotlib
  • Как я могу нарисовать значения NaN как особый цвет с imshow в matplotlib?
  • Как построить pandas multiindex dataFrame со всеми xticks
  • Получить координаты меток Matplotlib
  • pip install matplotlib: "no pkg-config"
  • Как я могу избавиться от ошибки импорта ft2font из matplotlib в исходной установке Windows XP?
  • функция плотности вероятности из гистограммы в питоне для установки другой гистограммы
  • Matplotlib, избегая нежелательных треугольников в plot_trisurf ()
  • matplotlib подзаголовки с одинаковыми настройками
  • matplotlib построит график в цикле, удалив colorbar, но пробелы остаются
  • Python - лучший язык программирования в мире.