matplotlib определяет диапазоны bin в его [дубликат]

Вот пример использования контроллера, введенного Guice.

/**
 * Loads a FXML file and injects its controller from the given Guice {@code Provider}
 */
public abstract class GuiceFxmlLoader {

   public GuiceFxmlLoader(Stage stage, Provider<?> provider) {
      mStage = Objects.requireNonNull(stage);
      mProvider = Objects.requireNonNull(provider);
   }

   /**
    * @return the FXML file name
    */
   public abstract String getFileName();

   /**
    * Load FXML, set its controller with given {@code Provider}, and add it to {@code Stage}.
    */
   public void loadView() {
      try {
         FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource(getFileName()));
         loader.setControllerFactory(p -> mProvider.get());
         Node view = loader.load();
         setViewInStage(view);
      }
      catch (IOException ex) {
         LOGGER.error("Failed to load FXML: " + getFileName(), ex);
      }
   }

   private void setViewInStage(Node view) {
      BorderPane pane = (BorderPane)mStage.getScene().getRoot();
      pane.setCenter(view);
   }

   private static final Logger LOGGER = Logger.getLogger(GuiceFxmlLoader.class);

   private final Stage mStage;
   private final Provider<?> mProvider;
}

Вот конкретная реализация загрузчика:

public class ConcreteViewLoader extends GuiceFxmlLoader {

   @Inject
   public ConcreteViewLoader(Stage stage, Provider<MyController> provider) {
      super(stage, provider);
   }

   @Override
   public String getFileName() {
      return "my_view.fxml";
   }
}

Обратите внимание, что этот пример загружает представление в центр BoarderPane, который является корнем сцены в рабочей области. Это не относится к примеру (деталь реализации моего конкретного варианта использования), но решил оставить его, поскольку некоторые из них могут оказаться полезными.

101
задан Sam Creamer 8 August 2011 в 19:46
поделиться

8 ответов

На самом деле это довольно просто: вместо количества ящиков вы можете указать список с границами бинов. Они также могут быть распределены неравномерно:

plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])

Если вы просто хотите, чтобы они были одинаково распределены, вы можете просто использовать диапазон:

plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))

Добавлено в исходный ответ

Вышеупомянутая строка работает для data, заполненной целыми числами. Как указывает macrocosme , для поплавков вы можете использовать:

import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))
178
ответ дан Community 18 August 2018 в 06:45
поделиться
  • 1
    Обратите внимание, что последняя строка работает только для целых чисел, а не для float. – Gabriel 9 August 2013 в 02:44
  • 2
    замените диапазон (...) на np.arange (...), чтобы заставить его работать с поплавками. – macrocosme 25 August 2014 в 09:42
  • 3
    Дополнительный вопрос: как рисовать ось, чтобы увидеть значение каждого бункера? Теперь я вижу только 10..20..30.. – cqcn1991 10 August 2015 в 06:08
  • 4
    Что такое бинарник здесь? У вас есть это значение раньше? – UserYmY 29 September 2015 в 13:25
  • 5
    Я считаю, что ширина бина в этом примере может быть найдена: (data.max() - data.min()) / number_of_bins_you_want. + binwidth можно изменить только на 1, чтобы сделать это более понятным примером. – Jarad 22 January 2018 в 18:31

Для гистограммы с целыми значениями х я закончил с использованием

plt.hist(data, np.arange(min(data)-0.5, max(data)+0.5))
plt.xticks(range(min(data), max(data)))

. Смещение 0,5 центрирует ячейки на значениях по оси x. Вызов plt.xticks добавляет галочку для каждого целого числа.

0
ответ дан Adversus 18 August 2018 в 06:45
поделиться

Для N бинов края бункера указаны в списке значений N + 1, где первый N дает нижние края буфера, а +1 дает верхний край последнего бункера.

Код:

from numpy import np; from pylab import *

bin_size = 0.1; min_edge = 0; max_edge = 2.5
N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1
bin_list = np.linspace(min_edge, max_edge, Nplus1)

Обратите внимание, что linspace производит массив от min_edge до max_edge, разбитый на N + 1 или N бит

13
ответ дан aloha 18 August 2018 в 06:45
поделиться
  • 1
    Обратите внимание, что бинды содержат их нижнюю границу и исключают их верхнюю границу, за исключением N + 1 (последнего) бина, который включает обе границы. – lukewitmer 1 March 2016 в 18:59

У меня была такая же проблема, как OP (я думаю!), но я не мог заставить ее работать так, как указано в Lastalda. Я не знаю, правильно ли я правильно истолковал вопрос, но я нашел другое решение (возможно, это действительно плохой способ сделать это).

Так я сделал это:

plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);

Что создает это:

Итак, первый параметр в основном «инициализирует» бит - я специально создаю число, находящееся между диапазоном I, установленным в параметре bins.

Чтобы продемонстрировать это, посмотрите на массив в первом параметре ([1,11,21,31,41]) и массив «бункеров» во втором параметре ([0,10,20,30,40,50]):

  • Число 1 (из первого массива) падает между 0 и 10 (в массиве «бит»)
  • Число 11 (из первого массива) падает между 11 и 20 (в массиве «бинов»)
  • Число 21 (из первого массива) падает между 21 и 30 (в массиве «бит» и т. д.

Затем я использую параметр «вес» для определения размера каждого бина. Это массив, используемый для параметра веса: [10,1,40,33,6].

Таким образом, от 0 до 10 bin задано значение 10, от 11 до 20 бит задано значение от 1, от 21 до 30 бит дано значение 40 и т. д.

4
ответ дан bluguy 18 August 2018 в 06:45
поделиться
  • 1
    Я думаю, что у вас есть основное недоразумение, как работает функция гистограммы. Он ожидает сырые данные. Итак, в вашем примере ваш массив данных должен содержать 10 значений от 0 до 10, 1 от 10 до 20 и т. Д. Тогда функция выполняет суммирование и чертеж. То, что вы делаете выше, является обходным путем, потому что у вас уже есть суммы (которые вы затем вставляете в график, злоупотребляя опцией «вес»). Надеюсь, что это смущает некоторую путаницу. – CodingCat 1 December 2017 в 16:29

Я думаю, что простой способ состоял бы в том, чтобы вычислить минимальные и максимальные данные, которые у вас есть, а затем вычислить L = max - min. Затем вы делите L на желаемую ширину бункера (я предполагаю, что это то, что вы подразумеваете под размером бункера), и используйте потолок этого значения как количество ящиков.

4
ответ дан Il-Bhima 18 August 2018 в 06:45
поделиться
  • 1
    это именно то, что я имел в виду, спасибо. Было просто интересно, был ли более простой способ, но это, похоже, находит спасибо! – Sam Creamer 8 August 2011 в 20:09
  • 2
    Используя круглые числа, я не получаю круглый размер бункера при таком подходе. Кто-нибудь испытал это? – Brad Urani 3 November 2013 в 17:12
0
ответ дан TonyRyan 6 September 2018 в 20:32
поделиться
0
ответ дан scopchanov 30 October 2018 в 01:51
поделиться
0
ответ дан TonyRyan 30 October 2018 в 01:51
поделиться
Другие вопросы по тегам:

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