java – JFreeChart自定义x轴标签
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JFreeChart自定义x轴标签,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3716字,纯文字阅读大概需要6分钟。
内容图文
![java – JFreeChart自定义x轴标签](/upload/InfoBanner/zyjiaocheng/787/2140a25841bc4ba7a54e11813d8523e3.jpg)
我有多个系列的数据.
>系列年份:2013,2014,2015等
>数据是给定年份内的日期值.
>因为数据需要按年份分类,我在x轴上使用“一年中的某一天”值,范围在1到366之间.因此给定年份的值如下所示:(1,80),(30,100) ),(60,71)…..(255,130)
示例图:
我的问题是X轴包含“一年中的某一天”值,但我必须在那里放置月份名称.不幸的是,使用简单的DateAxis不是一个选项,因为X值是日期数字(不是日期),而AFAIK没有可以将“335”转换为“12月”的日期格式. DateAxis的另一个问题是它表示时间点,它为任何时间点提供单独的X轴标签.但我需要及时写出确切时间点的标签.即:仅在几个月的开始.我真正想要的是这样的:
例如.而不是在一个月的开头/结尾放置“滴答声”,我想显示区域.更难的是月份有不同的长度.由于二月有闰年29天,我想我将不得不使用固定点(一年中的数值).
我是否必须为此编写自定义轴渲染器?怎么样?我的问题有更简单的解决方案吗?
解决方法:
import java.awt.Graphics2D;
import java.awt.font.LineMetrics;
import java.awt.geom.Rectangle2D;
import java.util.List;
import java.awt.Color;
import org.jfree.chart.axis.AxisState;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueTick;
import org.jfree.text.TextUtilities;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.TextAnchor;
public class DayOfYearAxis extends NumberAxis {
/* Day of the year values for month end days. */
public static final Integer[] MONTH_LENGTHS = {
31,29,31,30,31,30,31,31,30,31,30,31
};
public static final String[] MONTH_NAMES = {
"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
};
protected AxisState drawTickMarksAndLabels(Graphics2D g2,double cursor,Rectangle2D plotArea,Rectangle2D dataArea,RectangleEdge edge) {
AxisState state = new AxisState(cursor);
g2.setFont(getTickLabelFont());
double ol = getTickMarkOutsideLength();
double il = getTickMarkInsideLength();
int y = (int)(Math.round(cursor-ol));
LineMetrics lineMetrics = g2.getFont().getLineMetrics("ápr", g2.getFontRenderContext());
int h = (int) (lineMetrics.getHeight() + 6);
List<ValueTick> ticks = refreshTicks(g2, state, dataArea, edge);
state.setTicks(ticks);
/* Last x point */
ValueTick tick = ticks.get(ticks.size()-1);
float[] prevAnchorPoint = calculateAnchorPoint(tick, cursor,dataArea, edge);
double xmax = prevAnchorPoint[0];
double max_day = tick.getValue();
/* First x point */
tick = ticks.get(0);
prevAnchorPoint = calculateAnchorPoint(tick, cursor,dataArea, edge);
double xmin = Math.round(prevAnchorPoint[0]);
double min_day = tick.getValue();
double days_visible = max_day - min_day + 1;
/* 0.1 day horizontal gap. */
double gap = 0.1*(xmax-xmin)/days_visible;
System.out.println("min_day "+min_day+" max_day"+max_day);
g2.setFont(getTickLabelFont());
g2.setColor(Color.BLACK);
int start_day = 0;
for (int month=0;month<12;month++) {
int end_day = start_day + MONTH_LENGTHS[month] - 1;
System.out.println("start-end "+start_day+" "+end_day);
if ( (start_day>=min_day) && (start_day<=max_day) && (end_day>=min_day) && (end_day<=max_day) ) {
double factor_x1 = (start_day - min_day) / days_visible;
double x1 = xmin + (xmax-xmin)* factor_x1;
double factor_x2 = (end_day - min_day) / days_visible;
double x2 = xmin + (xmax-xmin)* factor_x2;
System.out.println("month="+month+", start_day="+start_day+" end_day="+end_day+" x1="+x1+" x2="+x2);
g2.setColor(Color.LIGHT_GRAY);
g2.fill3DRect((int)(x1+gap),y,(int)(x2-x1-2*gap),h,true);
g2.setColor(Color.BLACK);
TextUtilities.drawAlignedString(MONTH_NAMES[month], g2, (float)((x1+x2)/2), (float)(y+ol), TextAnchor.TOP_CENTER);
}
start_day += MONTH_LENGTHS[month];
}
return state;
}
}
用法:
JFreeChart chart = ChartFactory.createXYLineChart(...);
DayOfYearAxis doyAxis = new DayOfYearAxis();
/* optional
doyAxis.setAutoRange(false);
doyAxis.setRange(new Range(min_yday, max_yday));
*/
chart.getXYPlot().setDomainAxis(doyAxis);
输出示例(匈牙利月份名称):
内容总结
以上是互联网集市为您收集整理的java – JFreeChart自定义x轴标签全部内容,希望文章能够帮你解决java – JFreeChart自定义x轴标签所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。