Гистограмма на Java


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

Что вообще такое обычная гистограмма (Clustered Column)? По сути дела это графическое представление определенных данных. С помощью такой формы можно наглядно показать разницу, динамику и изменение данных. Например, у нас есть данные по посещаемости некоторых сайтов в определенные месяцы года. Можно их наглядно представить в виде гистограммы:



Теперь попробуем то же самое реализовать на Java. Для рисования нам потребуется создать класс DrawingComponent, который будет создан на основе класса (расширять его возможности) JPanel. Листинг:

class DrawingComponent extends JPanel {
 @Override
    protected void paintComponent(Graphics gh) {       
     Graphics2D drp = (Graphics2D)gh;   
     
     //горизонтальные линии и обозначения
      for (int i=2; i<9; i++) {
     drp.drawLine(50, 50+44*i, 400, 50+44*i);
  int vs = 80 - i*10;
     drp.drawString(vs+"", 30, 50+44*i);
     }
      
      drp.drawString("upread.ru", 100, 40);
      drp.drawString("google.ru", 100, 60);
      drp.drawString("yandex.ru", 100, 80);
      
      drp.drawString("Январь", 60, 420);
      drp.drawString("Февраль", 160, 420);
      drp.drawString("Март", 260, 420);
      drp.drawString("Апрель", 360, 420);
      
      drp.setColor(Color.BLUE);
      drp.fillRect(80, 30, 10, 10);
      drp.setColor(Color.RED);
      drp.fillRect(80, 50, 10, 10);
      drp.setColor(Color.GREEN);
      drp.fillRect(80, 70, 10, 10);
      
   for (int i=0; i<4; i++) {
     //строим саму гистограмму 
       //извлекаем цвет для каждого графика
      Color color = RED; 
       for (int j=0;j<3;j++) { 
           try {
           Field field = Class.forName("java.awt.Color").getField(GrGis.col[j].toLowerCase());
      color = (Color)field.get(null);
           } catch (Exception e) {}
           drp.setColor(color); 
    //переводим полученные данные в реальные координаты  
     int realY = (int) (400-44*GrGis.y[j][i]/10)+3;   
     drp.fillRect(50+20*j+100*i, realY, 20,(int) (GrGis.y[j][i]*4.4));
       }
   }      
    }
}
Сложного тут нет ничего совершенно: мы просто рисуем линии и прямоугольники и добавляем текст по заданным координатам. А вот сами координаты берутся из основного класса – здесь двумерный массив y определяется в основном методе для наглядности:

public class GrGis extends JFrame{
    public  static double y[][] = new double[3][4];
    public  static String col[] = {"BLUE", "RED", "GREEN"};//массив цветов 
    
    public GrGis () {  
      super("Обычная гистограмма");
        JPanel jcp = new JPanel(new BorderLayout());
        setContentPane(jcp);
        jcp.add(new DrawingComponent(), BorderLayout.CENTER);     
        jcp.setBackground(Color.gray);
        setSize(500, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);   
    }   
    
    public static void main(String[] args) {   
           y[0][0]=5;   
           y[0][1]=10;
           y[0][2]=12;
           y[0][3]=8;
   
           y[1][0]=24;
           y[1][1]=44;
           y[1][2]=18;
           y[1][3]=28;
                  
           y[2][0]=20;     
           y[2][1]=20;
           y[2][2]=30;     
           y[2][3]=50;
        
         GrGis gr = new GrGis ();
         gr.setVisible(true);
    }  
}
Тут тоже ничего особо сложного нет. Создаем окно, пара массивов – со значениями и цветами, добавляем панель на окно. В итоге мы имеем вот это:



Вот так с помощью awt и swing можно реализовать обычную гистограмму, создать класс для работы с деловой графикой на языке Java. Если у вас есть какие-либо вопросы, или требуется написать программу на Java, то вы в любое время можете обратиться ко мне.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, java, графики, гистограмма




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




Убираем 503 и блокируем баблософт
Required и onclick
Приключения детей после смерти в другом мире