Постройте круг со всеми значениями цвета [дубликат]

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

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

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

15
задан EelkeSpaak 11 August 2015 в 11:22
поделиться

2 ответа

Один из способов, который я нашел, - создать цветную карту, а затем проецировать ее на полярную ось. Вот рабочий пример - он включает в себя неприятный взлом, хотя (четко прокомментированный). Я уверен, что есть способ либо отрегулировать ограничения, либо (сложнее) написать свой собственный Transform, чтобы обойти его, но я еще совсем не справился с этим. Я думал, что ограничения на вызов Normalize будут делать это, но, по-видимому, нет.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
import matplotlib as mpl

fig = plt.figure()

display_axes = fig.add_axes([0.1,0.1,0.8,0.8], projection='polar')
display_axes._direction = 2*np.pi ## This is a nasty hack - using the hidden field to 
                                  ## multiply the values such that 1 become 2*pi
                                  ## this field is supposed to take values 1 or -1 only!!

norm = mpl.colors.Normalize(0.0, 2*np.pi)

# Plot the colorbar onto the polar axis
# note - use orientation horizontal so that the gradient goes around
# the wheel rather than centre out
quant_steps = 2056
cb = mpl.colorbar.ColorbarBase(display_axes, cmap=cm.get_cmap('hsv',quant_steps),
                                   norm=norm,
                                   orientation='horizontal')

# aesthetics - get rid of border and axis labels                                   
cb.outline.set_visible(False)                                 
display_axes.set_axis_off()
plt.show() # Replace with plt.savefig if you want to save a file

Это приводит к

Если вы хотите кольцо, а не колесо, используйте его до plt.show() или plt.savefig

display_axes.set_rlim([-1,1])

. Это дает


В соответствии с @EelkeSpaak в комментариях - если вы сохраняете графику как SVG в соответствии с OP, вот подсказка для работы с полученным графиком: Маленькие элементы результирующее изображение SVG касаются и не перекрываются. Это приводит к слабым серым линиям в некоторых рендерах (Inkscape, Adobe Reader, возможно, не в печати). Простым решением этого является применение небольшого (например, 120%) масштабирования для каждого из отдельных элементов градиента, используя, например, Inkscape или Illustrator. Обратите внимание, что вам придется применять преобразование к каждому элементу отдельно (указанное программное обеспечение предоставляет функциональные возможности для этого автоматически), а не всего чертежа, в противном случае он не имеет эффекта.

14
ответ дан Community 19 August 2018 в 00:00
поделиться
  • 1
    Отлично, я попытался использовать некоторые вещи, используя ColorbarBase, но пропустил ключевое слово orientation. Это решение, безусловно, лучше, чем мое собственное (поскольку «спицы» на колесе теперь больше не перекрываются), но это все еще не совсем то решение, которое я хотел, так как в результате векторного искусства все еще имеется много отдельных элементов пути, а не один Безье -круглый круг. Большое спасибо в любом случае; если никто не придет с решением true , я помечаю ваш ответ как принятый :) – EelkeSpaak 11 August 2015 в 13:27
  • 2
    Ах, я понимаю, что вы имеете в виду. Я подумаю об этом - извините за то, что вы не достаточно внимательно прочитали вопрос;) – J Richard Snape 11 August 2015 в 13:42
  • 3
    Несколько мыслей, на которые я напомнил, что кривые Безье не могут фактически создать идеальный круг: этот ответ , похоже, назад. Я также думаю, что для matplotlib, 1 элемент = 1 цвет. Поэтому, когда мы видим градиенты, на самом деле мы видим множество плотно упакованных маленьких элементов. Еще один ответ о окрашивании градиентами , похоже, поддерживает это представление. Элементам может быть много маленьких сегментов безье, но я думаю, что вы все равно получите видимое квантование. Может, кто-то придет и докажет, что я не прав :) – J Richard Snape 11 August 2015 в 13:53
  • 4
    Еще один совет. Маленькие элементы полученного SVG-изображения касаются и не перекрываются. Это приводит к слабым серым линиям в некоторых рендерах (Inkscape, Adobe Reader, возможно, не в печати). Простым решением этого является применение небольшого (например, 120%) масштабирования для каждого из отдельных элементов градиента, используя, например, Inkscape или Illustrator. Обратите внимание, что вам придется применять преобразование к каждому элементу отдельно (указанное программное обеспечение предоставляет функциональные возможности для этого автоматически), а не ко всему чертежу, в противном случае это не влияет. – EelkeSpaak 23 September 2015 в 15:18
  • 5
    @Greedo Глядя более внимательно на мой код - это, вероятно, прокомментированный «Nasty hack». что больше не работает. Я изменил там внутреннюю переменную - что-то вам не нужно делать, и хотя она работает уже 2 года, похоже, что моя удача закончилась. Это проблема с такими хаками - поведение библиотеки "под капотом". может измениться без предупреждения. Если я получу некоторое время, я обновлю ответ. – J Richard Snape 24 October 2017 в 09:07

Мне просто нужно было сделать цветовое колесо и решил обновить решение rsnape для совместимости с matplotlib 2.1. Вместо того, чтобы помещать объект цветной панели на ось, вы можете вместо этого построить полярную цветную сетку на полярном графике.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
import matplotlib as mpl

#If displaying in a Jupyter notebook:
%matplotlib inline 

#Generate a figure with a polar projection
fg = plt.figure(figsize=(8,8))
ax = fg.add_axes([0.1,0.1,0.8,0.8], projection='polar')

#define colormap normalization for 0 to 2*pi
norm = mpl.colors.Normalize(0, 2*np.pi) 

#Plot a color mesh on the polar plot
#with the color set by the angle

n = 200  #the number of secants for the mesh
t = np.linspace(0,2*np.pi,n)   #theta values
r = np.linspace(.6,1,2)        #raidus values change 0.6 to 0 for full circle
rg, tg = np.meshgrid(r,t)      #create a r,theta meshgrid
c = tg                         #define color values as theta value
im = ax.pcolormesh(t, r, c.T,norm=norm)  #plot the colormesh on axis with colormap
ax.set_yticklabels([])                   #turn of radial tick labels (yticks)
ax.tick_params(pad=15,labelsize=24)      #cosmetic changes to tick labels
ax.spines['polar'].set_visible(False)    #turn off the axis spine.

Он дает следующее:

A color wheel for the viridis colormap. Made with matplotlib 2.1. [/g0]

1
ответ дан Patrick Haugh 19 August 2018 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: