Тестируем CGraphic - вопросы и предложения - страница 8

 
Vladimir Karputov:

И сразу пожелание: я могу сделать наклонный (под углом) шрифт СРАЗУ для двух осей (my_graphic.FontSet("Arial",10,0,180);). Нельзя ли сделать такой метод установки шрифта (или угла) для отдельной оси?

Добрый день! Для изменения наклона шрифта осей нужно будет добавить в класс CAxis три новых поля и шесть новых методов для их обслуживания, а он и так на данный момент выглядит уже немного перегруженным. Поэтому я не могу сказать - будет ли добавлен такой функционал или нет. В вашем случае могу посоветовать реализовать наследника от CGraphics, и в нем переопределить метод CreateAxes (переписать буквально две строчки).

 

Подскажите пож-ста, как добавить текст на научный график. Как ни изголялся, не получилось. Вот немного изменённый код из примера:

void OnStart()
  {
   CGraphic graphic;
   graphic.Create(0,"Graphic",0,30,30,780,380);
   double x[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y[]={-5,4,-10,23,17,18,-9,13,17,4};
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.Name("Example");
   graphic.XAxis().Name("X - axis");
   graphic.XAxis().NameSize(12);
   graphic.YAxis().Name("Y - axis");
   graphic.YAxis().NameSize(12);
   graphic.YAxis().ValuesWidth(15);
//--- текст
   int txt_x=2;
   int txt_y=4;
   graphic.FontSet("Arial",10);
   graphic.TextAdd(txt_x,txt_y,"Testing",ColorToARGB(clrGreen));
//--- перерисовка
   graphic.CurvePlotAll();
   graphic.Update();
   DebugBreak();
  }


Вообще, огромное спасибо, что есть "многочисленные" примеры по CGraphic!!!

На какие-то мелочи приходится тратить много времени, пока не плюнешь и не выругаешься, бросив всё к чертям...

 
Dennis Kirichenko:

Вообще, огромное спасибо, что есть "многочисленные" примеры по CGraphic!!!

Но ведь есть примеры, например  https://www.mql5.com/ru/articles/2866 и https://www.mql5.com/ru/docs/standardlibrary/mathematics/stat
Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R
Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R
  • 2017.02.07
  • MetaQuotes Software Corp.
  • www.mql5.com
При исследовании и изучении закономерностей важную роль играет визуальное отображение с помощью графиков. В популярных среди научного сообщества языках программирования, таких как R и Python, для визуализации предназначена специальная функция plot. С её помощью можно рисовать линии, точечные распределения и гистограммы для наглядного представления закономерностей. В MQL5 вы можете делать всё то же самое с помощью класса CGraphics.
 
Rashid Umarov:
Но ведь есть примеры, например  https://www.mql5.com/ru/articles/2866 и https://www.mql5.com/ru/docs/standardlibrary/mathematics/stat

Мало. И не нашёл там ни TextAdd(), ни LineAdd().

 
Dennis Kirichenko:

Мало. И не нашёл там ни TextAdd(), ни LineAdd().

Добрый день! Решение вашей проблемы кроется в этих строках:

Также среди дополнительных возможностей библиотеки Graphics нужно отметить методы, которые позволяют добавлять на график новые элементы:

  1. TextAdd() — добавляет текст в произвольное место на графике, координаты необходимо задавать в реальном масштабе. Для точной настройки выводимого текста используйте метод FontSet.
  2. LineAdd() — добавляет линию в произвольное место на графике, координаты необходимо задавать в реальном масштабе.
  3. MarksToAxisAdd() — добавляет новые отметки на указанную координатную ось.
Важно отметить, что данные о добавлении этих элементов нигде не хранятся, следовательно, после отрисовки новой кривой на графике или его перерисовки все они будут затёрты.

Вы вызовом метода graphic.CurvePlotAll() затираете текст, который хотели отрисовать. Правильно будет так:

void OnStart()
  {
   CGraphic graphic;
   graphic.Create(0,"Graphic",0,30,30,780,380);
   double x[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y[]={-5,4,-10,23,17,18,-9,13,17,4};
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.Name("Example");
   graphic.XAxis().Name("X - axis");
   graphic.XAxis().NameSize(12);
   graphic.YAxis().Name("Y - axis");
   graphic.YAxis().NameSize(12);
   graphic.YAxis().ValuesWidth(15);
//--- текст
   int txt_x=2;
   int txt_y=4;
//--- перерисовка
   graphic.CurvePlotAll();
   graphic.FontSet("Arial",10);
   graphic.TextAdd(txt_x,txt_y,"Testing",ColorToARGB(clrGreen));
   graphic.Update();
   DebugBreak();
  }

Результат:

 

Roman Konopelko, огромное спасибо!

М-да, имхо, такие особенности работы с графикой стоит указывать в Документации.

 

Вопрос к знатокам такой. Есть тиковый график на основе научного CGraphic.


Нужно:

1) сделать отступ, как на графике в МТ. Чтобы последние значения не примыкали к правой границе графика;

2) отобразить Y-шкалу справа, а не слева.

Не нашёл в методах таких возможностей...

 

Dennis Kirichenko:

Нужно:

1) сделать отступ, как на графике в МТ. Чтобы последние значения не примыкали к правой границе графика;

//+------------------------------------------------------------------+
//| Class CAxis                                                      |
//| Usage: class for create axes on a two-dimensional graphics       |
//+------------------------------------------------------------------+
class CAxis
  {
private:
...
   double            m_min_grace;      // "grace" value applied to the minimum data range
   double            m_max_grace;      // "grace" value applied to the maximum data range

public:
                     CAxis(void);
                    ~CAxis(void);
...
   double            MaxGrace(void)                     const { return(m_max_grace);      }
   void              MaxGrace(const double value)             { m_max_grace=value;        }
...
  };

//---

Пример, как это выглядит:



 

Dennis Kirichenko:

Нужно:

...

2) отобразить Y-шкалу справа, а не слева.

А вот такой возможности нет. Было бы неплохо, если бы можно было не только шкалу справа помещать, но также отображать две независимые шкалы (основная и вспомогательная), как это можно сделать, например, в Excel:


 

Анатолий, огромное спасибо! Помогло по п.1. Да, я упустил из виду осевой метод CAxis::MaxGrace(const double value).

Причина обращения: