JQPlot线性图表上的自定义工具提示

5

我正在尝试为线图获取自定义工具提示,因为我希望工具提示可以更详细地描述点,而不仅仅是该点的值。 (附有进一步解释的图片)

我已经尝试了如何实现。

下面是我的代码:

<script type="text/javascript">        $('#page3a').live('pageshow', function () {
        var s1 = [1, 2, 3, 4, 5];
        var s2 = ["Message 1", "Message 2", "Message 3", "Message 4", "Message 5"];

        var lineGraph1 = $.jqplot('lineGraph1', [s1,s2], {

            animate: true,
            seriesDefault: {
                showMarker: false,
                pointLabels: { show: true }
            },

            grid: {
                drawBorder: false,
                drawGridlines: false,
                background: '#eafaff',
                shadow: false
            },
            axesDefaults: {
                show: false,

                showTicks: false,
                showTickMarks: false

            },

            highlighter: {
                show: true,
                sizeAdjust: 8,
                tooltipLocation: 'n',
                tooltipAxes: 'piered',
               formatString:'%s',
                fadeTooltip: true,
                tooltipFadeSpeed: "fast",
                useAxesFormatters: false

            }

        });
    });</script>

任何帮助都将不胜感激。 :)
6个回答

7

有一个配置选项可以让您提供自定义回调方法,以调用检索工具提示内容:

highlighter: {
    tooltipContentEditor: function (str, seriesIndex, pointIndex) {
        return str + "<br/> additional data";
    },

    // other options just for completeness
    show: true,
    showTooltip: true,
    tooltipFade: true,
    sizeAdjust: 10,
    formatString: '%s',
    tooltipLocation: 'n',
    useAxesFormatters: false,
}

3

我对nick_w的答案进行了轻微编辑。但现在我已经达到了预期的效果,只需将代码粘贴以帮助未来的其他人。

<script type="text/javascript">     

   $('#page3a').live('pageshow', function () {
          var s1 = [1, 2, 3, 4, 5];
          var s2 = ["Message 1", "Message 2", "Message 3", "Message 4", "Message 5"];

          var lineGraph1 = $.jqplot('lineGraph1', [s1, s2], {

              animate: true,
              seriesDefault: {
                  showMarker: false,
                  pointLabels: { show: true }
              },

              grid: {
                  drawBorder: false,
                  drawGridlines: false,
                  background: '#eafaff',
                  shadow: false
              },
              axesDefaults: {
                  show: false,

                  showTicks: false,
                  showTickMarks: false

              }
          });

          $('#lineGraph1').bind('jqplotDataMouseOver', function (ev, seriesIndex, pointIndex, data) {

              var mouseX = ev.mouseX; //these are going to be how jquery knows where to put the div that will be our tooltip
              var mouseY = ev.mouseY;
              $('#chartpseudotooltip').html(s2[pointIndex] );
              var cssObj = {
                  'position': 'absolute',
                  'font-weight': 'bold',
                  'left': mouseX + 'px', //usually needs more offset here
                  'top': mouseY + 'px',
                  'background-color': 'white',
                  'z-index':'1'
              };
              $('#chartpseudotooltip').css(cssObj);

          });

          $('#lineGraph1').bind('jqplotDataUnhighlight', function (ev) {
              $('#chartpseudotooltip').html('');
          });
      });</script>

为了调用这个脚本,我向我的内容 div 中添加了以下内容。
<div id="lineGraph1" style="margin-top: 20px; margin-left: 160px; width: 350px; height: 350px">
        <div id="chartpseudotooltip"></div>

2

如果你想在数值前面添加文本“Message”,只需在formatString中添加即可:

highlighter:{
  show: true,
  formatString: 'Message %s',
  //other stuff like sizeAdjust...
}

你可以使用s2变量,如果它对应于你想要显示的刻度:
axes: {
   yaxis: {
       ticks: s2,
       tickRenderer: ...
   }
}

嗨,安东尼,谢谢你的留言。 我觉得我没有很好地解释问题。 我正在尝试使用jQplot创建一条折线图,我正在使用s1生成折线图,但是我正在尝试使用s2数据来代替tooltip上的s1。例如,如果我悬停在第一个tooltip上,它会给我更有意义的描述。这就是为什么我尝试使用s2来实现这一点的原因。 - Joz
我知道使用pieRenderer可以传递信息,例如["数据信息", 10],然后我可以使用pieRenderer根据y值绘制图表,但是当我悬停时,highlighter只显示X值。我尝试过在折线图中实现这一点,但是它不起作用。是否有专门的渲染器可用于折线图,以便我可以做到这一点? - Joz
首先很抱歉误解了。正如我所说,您可以通过axes: {xaxis(或yaxis):{ticks:s2}}将s2显示为x轴(或y轴)的刻度。然后在您的highlighter选项中,您可以使用tooltipAxes:x(如果您在y轴上显示刻度,则为y)选项定义要在工具提示中显示哪个轴。Jqplot highlighter documentation - AnthonyLeGovic
我已经按照您所说的修改了我的代码,但是图形不再绘制。以下是代码,我不确定我是否正确实现了您的解决方案。 - Joz

0

你可以在这里获得答案 jsfiddle

var line1=[['10/17/2013',21],['1/30/2014',3],['11/1/2013',12],['10/2/2013',3],['11/5/2013',18]];

   var line2=[['10/17/2013',41],['1/30/2014',33],['11/1/2013',12],['10/2/2013',63],['11/5/2013',18]];

var plot1 = $.jqplot('linegraph1', [line1,line2],{
  seriesDefaults: {
    lineWidth: 1,
     markerOptions: {
        show: true,             // wether to show data point markers.
        style: 'filledCircle',  // circle, diamond, square, filledCircle.
        size: 2            // size (diameter, edge length, etc.) of the marker.
    }},
    axes:{
      xaxis:{
        renderer:$.jqplot.DateAxisRenderer,

          tickOptions:{
            formatString:'%b&nbsp;%#d',
        showGridline: false
          }
      },
      yaxis:{min:0,numberTicks:25,
        tickOptions:{

        showGridline: false
          }
      }
    },
    legend :
    {
        "show" : true,
        location: 'se'
    },
    series : [
        {
            label : "line1",highlighter: {formatString: "<div style='text-align:center;'><span>%s </span><br/><span> Blue: %s <br/>custom tooltip<span></div>"}

        },
        {
            label : "line2",highlighter: {formatString: "<div style='text-align:center;'><span>%s </span><br/><span> Orange: %s <br/>custom tooltip<span></div>"},

        }
    ],
   highlighter: {
      show: true,
       sizeAdjust: 25.5,
       tooltipLocation: 's'
    }
  });

0
<script type="text/javascript">        $('#page3a').live('pageshow', function () {
        var s1 = [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5]];
        var s2 = [["Message 1"], ["Message 2"], ["Message 3"], ["Message 4"], ["Message 5"]];

        var lineGraph1 = $.jqplot('lineGraph1', [s1,s2], {


            seriesDefault: {
                showMarker: false,
                pointLabels: { show: true }
            },

            grid: {
                drawBorder: false,
                drawGridlines: false,
                background: '#eafaff',
                shadow: false
            },
            axes: {

                xaxis: {ticks: s2}


            },

                highlighter: {
                show: true,
                sizeAdjust: 8,
                tooltipLocation: 'n',
                tooltipAxes: 'x',
                formatString: '%s',


            }

        });
    });</script>

轴:{xaxis:{renderer:$ .jqplot.CategoryAxisRenderer,ticks:s2,tickRenderer:$ .jqplot.CanvasAxisTickRenderer}}。确保加载jqplot.canvasAxisTickRenderer.min.js。我现在不在家,所以还没有测试它。 - AnthonyLeGovic
在这里试一下:Fiddle here。我认为结果并不完全符合你的要求,因为工具提示始终显示。我最初的想法(使用s2作为刻度)似乎没有起作用(也许会有用?)因为它是显示元素的索引。 - AnthonyLeGovic

0

这样的东西怎么样(改编自 jqplot条形图工具提示)?

$('#lineGraph1').bind('jqplotDataMouseOver', function (ev, seriesIndex, pointIndex, data) {

    var mouseX = ev.pageX; //these are going to be how jquery knows where to put the div that will be our tooltip
    var mouseY = ev.pageY;
    $('#chartpseudotooltip').html(s2[pointIndex] + ', (' + data[0] +', ' + data[1] + ')');
    var cssObj = {
        'position' : 'absolute',
        'font-weight' : 'bold',
        'left' : mouseX + 'px', //usually needs more offset here
        'top' : mouseY + 'px',
        'background-color': 'white'
    };
    $('#chartpseudotooltip').css(cssObj);

});

$('#lineGraph1').bind('jqplotDataUnhighlight', function (ev) {
    $('#chartpseudotooltip').html('');
});

当鼠标经过数据点时,将绘制一个形式为Message X, (x_value, y_value)的小工具提示。然后,您可以进一步自定义样式以适应需要。

在此示例中,工具提示如下:

 <div id="chartpseudotooltip"></div>

我尝试实现了你的方法,但是我无法让工具提示正常工作。以下是我尝试实现的代码,这就是你想要的吗?http://pastebin.com/HrLrSDB4 - Joz
你实际上并没有绑定事件 - 这段代码并没有被调用。尝试将其移动到 live 处理程序中的最后一件事情,在图表创建之后立即执行。 - nick_w
谢谢你的解决方案,我对代码进行了轻微的编辑,但是我得到了想要的解决方案。 - Joz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接