jqueryflot图表x轴坐标过长完美解决方案(转)
近段时间,项目中使用到了flot这个图表工具,在实际使用的过程中,遇到了一个看似很简单的问题:当坐标的刻度如果过长时,会重叠在一起,影响阅读:
看到这个效果后的第一反应就是,能不能让坐标斜着显示啊?去查阅flot的文档,竟然没有留斜着显示的接口。只有标签的宽度labelWidth和高度labelHeight的设置。不甘心,还是去网上海搜,在google code的flot专区找到了有人在问,也有回答的几个方案:
方案1:改源码
有一大神修改了flot的源码,加入了一个labelAngle用于控制标签的角度,并将具体的改动的过程贴了出来,我本来打算的是,按照改源码的思路去做,可能是因为使用的flot的版本不一致,大神贴出来的代码中有一部分代码我使用的版本里面没有,而我对js这块并不精通,也不想换flot为低版本的,于是乎放弃掉改源码这一思路。
方案2:在HTML中自己写css进行角度控制
在图表生成的HTML中,加入如下的css进行控制label的角度。
.tickLabel
{
-o-transform:rotate(-60deg);
-moz-transform:rotate(-60deg);
-webkit-transform:rotate(-60deg);
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
}
于是,我按照此思路来了一试,不中,不管用啊。。。自己查找了一下,找到原因了,在flot的源码中有如下代码:
这里,flot是如果用户自己指定了font属性,则使用用户指定的font,如果没有指定,则将font的class设置为”flot-tick-label tickLabel”,而我之前自己指定过font,因此,在生成图表时,并不会有class=”flot-tick-label tickLabel”的元素,这也是为什么我加入css控制后不起作用的原因。于是,删掉自己定义的font,再看,在火狐浏览器里,完美。可是到IE浏览器里面看看,
IE里面只有90度,这是怎么回事,原来IE并不支持transform,而IE使用的是MatrixFilter。这里旋转90度对应的是css中的如下的代码:
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
rotation的值 0代表0°,1代表顺时针90°,2代表顺时针180°,3代表顺时针270°4代表顺时针360°,以此类推。
此方案并不是十分完美,存在的问题和注意的事项如下:
1、在生成图表时,一定不要指定font属性,否则不能生效
2、最致命的问题在于,IE中的角度太固定,只有90°,不完美。
基于以上两种思路,我结合了一下,考虑出如下的一种,还算完美的思路:
3> css控制字体,jquery.rotate.js控制旋转角度
在生成图表时,不要指定font,而用css来控制字体样式:
.xAxis >.tickLabel
{
font-size: 10px;
margin-top: 20px;
}
字体控制好了,怎么旋转角度呢?去网上搜了一下,发现了一个jQueryRotate.js的插件,可用于控制dom元素旋转的插件。引入该插件后,可使用如下语法来控制:
$(".xAxis > .tickLabel").rotate(-45);
方法的参数即为要旋转的角度。
这种方法还算比较完美,在IE,火狐,chrome,opera等主流浏览器中均能完美运行。但有一个注意事项,生成图表时不能指定字体。
xaxis: {
mode:"categories",
reserveSpace:true,
labelWidth:55,
font:{}
}
红色的font不能要。
这是在IE下的效果,火狐,chrome这种就更不用说了,正常。
附上google code的flot的地址,大家有兴趣自己看以看看:
http://code.google.com/p/flot/issues/detail?id=85#c20
续:
其实flot功能很强大,完全可以自定义刻度,横坐标,纵坐标,均可以自定义刻度。如果因为坐标过长而重叠影响显示效果,完全可以使用自定义的短的字符串来进行代替显示。当然,这是在需求范围内,如果需求就是显示那种较长的字符串当标签,那只能将坐标的标签旋转一定角度了。
下面做一个自定义刻度的小例子。
假设,从后台传过来的数据,经过解析后,是如下的对象数组形式:
var odata =
[ {date:"2012-12-12",count:32},
{date:"2012-12-13",count:24},
{date:"2012-12-14",count:43},
{date:"2012-12-15",count:53},
{date:"2012-12-16",count:20}
];
加入flot.categories.js后,数据格式可以是这样的:
vardata = [ ["January", 10], ["February", 8],["March", 4], ["April", 13], ["May", 17],["June", 9] ]
但是如果标签过长,显示会有问题。
我们可以自定义刻度来解决这个问题。
先定义两个数组,一个用来存放数据data,一个用来存放标签label
vardata = [];
varlabel = [];
循环遍历解析后的对象数组,然后对应着将count和日期date存放到相应的数组:
for(vari=0;i<odata.length;i++){
data.push([i,odata[i].count]);
label.push([i,odata[i].date]);
}
然后我们在调用.plot()函数生成图表时,指定对应轴的刻度即可:
$.plot("#placeholder", [ {label:"5天内变化图",data:data} ], {
series:{
bars:{
show:true,
barWidth:0.6,
align:"center"
}
},
xaxis:{
mode:"categories",
ticks:label
},
grid:{
hoverable:true,
clickable:true
}
});
这时现实出来的图应该是:
我们在写鼠标点击事件时,可以通过以下代码取到相应的值:
//item.datapoint[0]取的是x坐标值
//item.datapoint[1]取的是y坐标值的顶部值()
//item.datapoint[2]取的是y坐标值的底部值(这个貌似只有柱状图有,折线图等没有,因为可能涉及到堆栈图)
var x=item.datapoint[0],
yh=item.datapoint[1],
yb=item.datapoint[2];
//item.series.label是指传入数据时传入的label,这里是 "5天内变化图"
//item.series.xaxis.ticks[item.datapoint[0]].label取的是图里x坐标轴上的标签(不是x坐标值)
//item.series.xaxis.ticks[item.datapoint[0]]是一个Object类型,具体的是{v:1,label:"2012-12-12"}这中格式的Object
label = item.series.label+":"+
item.series.xaxis.ticks[item.datapoint[0]].label;
showTooltip(item.pageX,item.pageY,label + " 新增数量: " + (yh-yb)+"-----"+x);
以上一小段程序展示了如何从图表中取得相应的数据,取得x坐标值后,因为数据数组和标签数组是对应的,所以也能取得相应的label,然后就可以从后台进行数据查询了。
转自http://m.blog.csdn.net/blog/coolcaosj/17588557
jqueryflot图表x轴坐标过长完美解决方案(转)的更多相关文章
- echarts图表X轴文字过长解决解决方案:根据文字长度自动旋转
Echarts 标签中文本内容太长的时候怎么办 ? 关于这个问题搜索一下,有很多解决方案.无非就是 省略(间隔显示).旋转文字方向.竖排展示 前面两种解决方案,就是echarts暴露的: { ax ...
- highchart 设置双Y轴坐标 双x轴坐标方法
我们的图表一旦引入了两种不同单位或者数量级相差很大的数据以后,这时候需要两种坐标对其进行计量. 下面以设置双Y轴为例, y轴坐标的参数设置成: yAxis: [{ title: { text: '坐标 ...
- echarts x轴名称太长
echarts x轴名称太长了,隐藏一部分,鼠标移到名称上,显示全称 function extension(mychart, type) { let extension = document.getE ...
- Flash图表控件FusionCharts自定义图表y轴最大/最小值
自定义图表y轴的最大值和最小值 用户可以使用FusionCharts图表中<chart>元素的yAxisMaxValue和yAxisMinValue属性设置图表限制. 示例: <ch ...
- Android必知必会-获取View坐标和长宽的时机
如果移动端访问不佳,请访问–>Github版 背景 最近要实现一个功能,用到了一些属性动画,需要获取一些View的坐标信息,设计图如下: 这里我使用的是DialogFragment来实现的,可以 ...
- Echarts X轴内容过长自动隐藏,鼠标移动上去显示全部名称方法
最近公司做项目,使用echarts做开发,碰到一些数据的名称很长导致图例展示的效果不是很好,自己写了一个方法,当X轴内容过长时自动隐藏,鼠标移动上去显示全部名称 样例: 图二是鼠标移动到名称显示的,怎 ...
- MSCHART控件中长字符的X轴坐标标注全部显示
X轴坐标如果超过9位的话,就不能完全显示了,就会一个隔一个的显示,解决的办法: Chart1.ChartAreas[].AxisX.Interval = ; //设置X轴坐标的间隔为1 Chart1. ...
- Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。
http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加x ...
- Safari 前端开发调试 iOS 完美解决方案
转http://www.2cto.com/kf/201403/283404.html afari 前端开发调试 iOS 完美解决方案 2014-03-05 0个评论 来源:Safari ...
随机推荐
- ssl和https协议详解
转自:https://cuiyongxiu.com/201102/24157.html ssl协议的起源和历史我就不再多说了,就是那个Netscape 网景公司开发的,它的作用主要是提供了一种安全传输 ...
- UITextView添加一个placeholder功能
控件UITextField有个placeholder属性,UITextField和UITextView使用方法基本类似,有两个小区别:1.UITextField单行输入,而UITextView可以多行 ...
- 一道面试题,简单模拟spring ioc
自己实现的,程序写的土了点,很多情况没去考虑,主要是复习理解怎么使用反射来实现spring 的依赖注入. package dom4jtest; import java.lang.reflect.Inv ...
- 生成1~n的全排列
输入正整数n,输出n的全排列. 样例输入1: 3 样例输出1: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 分析: 按字典序从小到大的顺序输出所有的排列. (字典序:两个序 ...
- android:强制关闭其他应用
强制关闭其他应用,可以使用ActivityManager,首先需要获取(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 然后可以 ...
- 2016 - 1- 14 UI阶段学习补充 transform属性详解
UIView的transform属性 transform是view的一个重要属性,它在矩阵层面上改变view的显⽰状态,能实现view的缩放.旋转.平移等功能.transform是CGAffineTr ...
- 算法题----称硬币: 2n(并不要求n是2的幂次方)个硬币,有两个硬币重量为m+1, m-1, 其余都是m 分治 O(lgn)找出假币
Description: 有2n个硬币和一个天平,其中有一个质量是m+1, 另一个硬币质量为m-1, 其余的硬币质量都是m. 要求:O(lgn)时间找出两枚假币 注意: n不一定是2的幂次方 算法1: ...
- 【LeetCode OJ】Populating Next Right Pointers in Each Node
Problem Link: http://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/ Just trav ...
- JQuery源码分析(四)
jQuery多库共存处理 多库共存换句话说可以叫无冲突处理. 总的来说会有2种情况会遇到: 1.$太火热,jQuery采用$作为命名空间,不免会与别的库框架或者插件相冲突. 2.jQuery版本更新太 ...
- C# 线程问题
一:概述和概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线程&quo ...