гистограмма с текстом по оси X - PullRequest
14 голосов
/ 13 января 2011

Мне было интересно, как я могу сделать простую гистограмму, которая, возможно, имеет день в качестве оси X, со значениями «сегодня» и «вчера», а ось Y в качестве «времени» с соответствующими значениями «1»и «2».Я думаю, я не понимаю, как установить текст в качестве значений для оси X, как показать ось Y, и что именно делает rgaxis ... (Я нашел пример, используя axis = r.g.axis(0,300,400,0,500,8,2), и я только знаю, что этоxpos, ypos, width, ??, ?? num ticks, ??).Любое понимание было бы здорово!Или страница с более полнофункциональными примерами гистограммы (ярлыки и т. Д.).Спасибо.

Ответы [ 6 ]

30 голосов
/ 19 июля 2011

Ради тех, кто гуглит это:

r.g.axis(x_start, y_start, x_width, from, to, steps, orientation, labels, type, dashsize)

x_start и y_start : расстояние от оси текста до нижнего левого угла

x_width : положение конца текста вдоль оси x

от и до : используется для указания и диапазона доиспользуйте вместо использования метки аргумент

шагов : это число тактов - 1

ориентация : кажется, указывает ось X противось y

type : тип используемого тикового знака.

Все это было выведено из исходного кода .Я думаю, что сейчас переключусь на библиотеку графиков с документацией ...

10 голосов
/ 01 марта 2012

Текущий код (Raphaeljs 2.0) изменился и должен быть немного адаптирован для использования Raphael.g.axis вместо r.g.axis:

Raphael.g.axis (85,230,310, ноль, ноль, 4,2, [«Сегодня», «Вчера», "Завтра", "Будущее"], "|", 0, г)

9 голосов
/ 22 февраля 2011

вы на правильном пути.Вы используете g.axis, а позиционные аргументы для установки текста находятся в аргументе text (позиционный), а для переключения y используются аргументы ориентации.Я добавил здесь пример:

Гистограмма с текстом по оси X

надеюсь, это поможет.

7 голосов
/ 17 января 2013

Читая этот Q & A и дюжину подобных, я все еще не мог заставить gRaphaël показывать правильные метки для гистограммы. Казалось, что все рецепты относятся к старым версиям библиотеки или к страницам github, которых больше нет. gRaphaël выдает великолепные результаты, но его документы оставляют желать лучшего.

Однако я смог использовать комбинацию Firebug и Inspect This Element, чтобы следовать коду и посмотреть, что он произвел. Погружаясь в объект barchart, нужная геометрия прямо здесь. Чтобы избавить других от разочарований, вот как я решил проблему:

<script>

function labelBarChart(r, bc, labels, attrs) {
    // Label a bar chart bc that is part of a Raphael object r
    // Labels is an array of strings. Attrs is a dictionary
    // that provides attributes such as fill (text color)
    // and font (text font, font-size, font-weight, etc) for the
    // label text.

    for (var i = 0; i<bc.bars.length; i++) {
        var bar = bc.bars[i];
        var gutter_y = bar.w * 0.4;
        var label_x = bar.x
        var label_y = bar.y + bar.h + gutter_y;
        var label_text = labels[i];
        var label_attr = { fill:  "#2f69bf", font: "16px sans-serif" };

        r.text(label_x, label_y, label_text).attr(label_attr);
    }

}


// what follows is just setting up a bar chart and calling for labels
// to be applied

window.onload = function () {
    var r = Raphael("holder"),
        data3 = [25, 20, 13, 32, 15, 5, 6, 10],
        txtattr = { font: "24px 'Allerta Stencil', sans-serif", fill: "rgb(105, 136, 39)"};
    r.text(250, 10, "A Gratuitous Chart").attr(txtattr);
    var bc = r.barchart(10, 10, 500, 400, data3, {
            stacked: false,
            type: "soft"});
    bc.attr({fill: "#2f69bf"});
    var x = 1;

    labelBarChart(r, bc,
                 ['abc','b','card','d','elph','fun','gurr','ha'],
                 { fill:  "#2f69bf", font: "16px sans-serif" }
            );

};
</script>
<div id="holder"></div>

Есть несколько небольших очисток, которые вы могли бы сделать для labelBarChart(), но это в основном делает работу.

2 голосов
/ 31 марта 2013

Вот функция, которую я написал для добавления меток. Это не особенно элегантно, но добавит метки:

Raphael.fn.labelBarChart = function(x_start, y_start, width, labels, textAttr) {
  var paper = this;

  // offset width and x_start for bar chart gutters
  x_start += 10;
  width -= 20;

  var labelWidth = width / labels.length;

  // offset x_start to center under each column
  x_start += labelWidth / 2;

  for ( var i = 0, len = labels.length; i < len; i++ ) {
    paper.text( x_start + ( i * labelWidth ), y_start, labels[i] ).attr( textAttr );
  }
};

Использование выглядит следующим образом:

var paper = Raphael(0, 0, 600, 400);
var chart = paper.barchart(0, 0, 600, 380, [[63, 86, 26, 15, 36, 62, 18, 78]]);

var labels = ['Col 1', 'Col 2', 'Col 3', 'Col 4', 'Col 5', 'Col 6', 'Col 7', 'Col 8'];
paper.labelBarChart(0, 390, 600, labels, {'font-size': 14});
1 голос
/ 03 марта 2015

Поскольку я пытаюсь понять, как работает Raphaël, я хотел бы предложить решение проблемы с функцией labelBarChart, предложенной Джонатаном Юнисом. Рассматривая сгруппированные столбчатые графики (или другие столбчатые графики с более чем одним массивом значений), я добавил тест на bc.bars [0] в случае, если bc.bars.length означает количество массивов сгруппированных значений. *

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

<script>

function labelBarChart(r, bc, labels, attrs) {
    // Label a bar chart bc that is part of a Raphael object r
    // Labels is an array of strings. Attrs is a dictionary
    // that provides attributes such as fill (text color)
    // and font (text font, font-size, font-weight, etc) for the
    // label text.
    //Added test : replace bc.bars by generic variable barsRef 
    var barsRef = (typeof bc.bars[0].length === 'undefined') ? bc.bars : bc.bars[0];

    var bar, gutter_y, label_x, label_y, label_text;
    //Added consideration of set attrs (if set)
    var label_attr = (typeof attrs === 'undefined') ? {} : attrs;
    label_attr['fill'] = (typeof label_attr['fill'] === 'undefined') ? "#2f69bf" : label_attr['fill'];
    label_attr['font'] = (typeof label_attr['font'] === 'undefined') ? "16px sans-serif" : label_attr['font'];

    for (var i = 0; i<barsRef.length; i++) {
        bar = barsRef[i];
        gutter_y = bar.w * 0.4;
        label_x = bar.x
        label_y = bar.y + bar.h + gutter_y;
        label_text = labels[i];
        r.text(label_x, label_y, label_text).attr(label_attr);
    }
}


// what follows is just setting up a bar chart and calling for labels
// to be applied
// I added an array of data to illustrate : data4
window.onload = function () {
    var r = Raphael("holder"),
        data3 = [25, 20, 13, 32, 15, 5, 6, 10],
        data4 = [0, 2, 1, 40, 1, 65, 46, 11],
        txtattr = { font: "24px 'Allerta Stencil', sans-serif", fill: "rgb(105, 136, 39)"};
    r.text(250, 10, "A Gratuitous Chart").attr(txtattr);
    var bc = r.barchart(10, 10, 500, 400, [data3, data4] {
            stacked: true,
            type: "soft"});
    bc.attr({fill: "#2f69bf"});

    labelBarChart(r, bc,
                 ['abc','b','card','d','elph','fun','gurr','ha'],
                 { fill:  "#2f69bf", font: "16px sans-serif" }
            );

};
</script>
<div id="holder"></div>

Я только что проверил его с двумя массивами значений в стеке, так что я точно не знаю, работает ли он с большим количеством (с накоплением или нет). Пожалуйста, дайте мне знать!

...