在jpgraph的一个绘图线上使用多个标记样式

时间:2018-03-29 15:19:33

标签: php jpgraph

我有一组跨越多个日期的数据。一些数据点需要用不同的风格来识别,以便脱颖而出。我可以通过使用不同的标记样式创建2个绘图线来近似我需要的东西,但它看起来没有凝聚力并且可能让某些人感到困惑。以下是使用该方法的示例。

Sample Graph with 2 plot lines

应连接上述示例中的所有数据点。问题是

  • 是否可以创建具有不同标记样式的单个绘图线?
  • 如果上面的答案是否定的,有办法以某种方式"合并"两条曲线如此连接所有点?

创建示例图的代码:

#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;


//node and linked_list class make up a doubly linked list
template<class T> class node {
public:
    T value;
    node<T> * next;
    node<T> * previous;
    node<T>() { next = nullptr; previous = nullptr;  }
    node<T>(T v) { value = v; next = nullptr; previous = nullptr; }
    ~node<T>() { delete next; }
};

template<class T> class linked_list { //doubly linked list
public:
    node<T> * head;
    node<T> * tail;
    linked_list<T>() { head = nullptr; tail = nullptr;  }
    ~linked_list<T>() { delete head; }

    void push_front(T v) { //insert an item to the front
        node<T> * p = new node<T>(v);
        p->next = head;
        head = p;

        if (tail == nullptr) {
            tail = p;
        }
    }
};

//item and bag class just make up another doubly linked list
template<class X> class item {
public:
    X value;
    item<X> *next;
    item<X> *previous;
    item<X>(X v) { value = v; next = nullptr; previous = nullptr; }
    ~item<X>() { delete next; }
};

template<class X> class bag { //just another doubly linked list
public:
    item<X> *last;
    item<X> *first;
    int num_items;
    int size() { return num_items; }
    bag() { last = nullptr; first = nullptr; num_items = 0; } 
    ~bag() { delete first; }

    void push_back(X v) {  //insert an item to the back
        item<X> * p = new item<X>(v);

        if (num_items == 0) {
            last = first = p;
        }
        else {
            last->next = p;
            p->previous = last;
            last = p;
        }

        num_items++;
        last->next = nullptr;
    }
};

int main() {
    //When using built-in classes (like strings) as input
    //there's no problem at all
    linked_list<string> ls_1;
    ls_1.push_front("David");
    ls_1.push_front("John");

    bag<int> bag_1;
    bag_1.push_back(1);
    bag_1.push_back(2);

    //Problems arise here when using user defined classes (linked_list) as input
    //I traced back and found out that a destructor has been called
    //that erases all the data in the input. Donno how that happens
    bag<linked_list<string>> bag_string;
    bag_string.push_back(ls_1);

    //These lines are to prevent the memory leaking
    //I overwrote destructors for linked_list and node class
    //otherwise there's still memory leaking
    ls_1.~linked_list(); 
    bag_1.~bag();
    bag_string.~bag();

    _CrtDumpMemoryLeaks();

    getchar();
    getchar();
}

1 个答案:

答案 0 :(得分:0)

在一条线上有不同标记的方法是创建第三条线,它只是没有任何标记的线。然后将具有标记的当前行更改为散点图,以便仅使用所需标记添加点。当3个事物被绘制在一起时,2个散点图和线条,它们组合成一条带有不同标记的线条。

根据需要运行的修改后的代码是:

<?php
require_once 'jpgraph/jpgraph.php';
require_once 'jpgraph/jpgraph_line.php';
require_once 'jpgraph/jpgraph_date.php';
require_once 'jpgraph/jpgraph_scatter.php';

$line1D = array(1497844800,1498449600,1505102400,1516597200);
$line1Y = array(79.00,76.00,53.00,14.00);
$line2D = array(1504584000,1507521600);
$line2Y = array(9.87,9.93);

$line3D = array_merge($line1D,$line2D);
$line3Y = array_merge($line1Y,$line2Y);

$graph = new Graph(640,480);
$graph->clearTheme();
$graph->SetScale('datlin');

$graph->xaxis->SetLabelAngle(60);
$graph->xaxis->SetFont(FF_ARIAL,FS_NORMAL,8);
$graph->xaxis->SetLabelFormatString('m/d/Y',true);
$graph->yaxis->scale->SetGrace(5);

$line1=new ScatterPlot($line1Y,$line1D);
$line1->SetColor('#4A6EC6');
$line1->SetWeight(2);
$line1->mark->SetFillColor('#4A6EC6');
$line1->mark->SetType(MARK_FILLEDCIRCLE);
$graph->Add($line1);

$line2=new ScatterPlot($line2Y,$line2D);
$line2->SetColor('#4A6EC6');
$line2->SetWeight(2);
$line2->mark->SetType(MARK_CIRCLE);
$line2->mark->SetColor('#4A6EC6');
$graph->Add($line2);

$line3=new LinePlot($line3Y,$line3D);
$line3->SetColor('#4A6EC6');
$line3->SetWeight(2);
$graph->Add($line3);

$graph->Stroke();  // display the graph
?>