【问题标题】:Legend Title not displayed correctly within chart图例标题未在图表中正确显示
【发布时间】:2020-02-15 16:54:23
【问题描述】:

我使用 JFreeChart API v1.5.0 创建了一个条形图,并将带有标题的图例添加到图表中。

我使用了Bar Chart Demo 中的示例,并将以下图例代码添加到示例中。

//Legend default properties
protected static final boolean LEGEND_ON = true;
private static final RectangleEdge LEGEND_POSITION = RectangleEdge.RIGHT;
private static final String LEGEND_TITLE_TEXT = "Legend";
private static final Font LEGEND_TITLE_FORMAT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
private static final Color LEGEND_TITLE_COLOR = Color.BLACK;
private static final double LEGEND_MAX_WIDTH = 0.0;
private static final Color LEGEND_BG_COLOR = Color.WHITE;
private static final Color LEGEND_BORDER_COLOR = Color.WHITE;
private static final Font LEGEND_TEXT_FORMAT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
private static final Color LEGEND_TEXT_COLOR = Color.BLACK;

LegendTitle legend = chart.getLegend();
legend.setPosition(LEGEND_POSITION);
legend.setWidth(LEGEND_MAX_WIDTH);
legend.setBackgroundPaint(LEGEND_BG_COLOR);
legend.setFrame(new BlockBorder(1, 1, 1, 1, LEGEND_BORDER_COLOR));
legend.setItemFont(LEGEND_TEXT_FORMAT);
legend.setItemPaint(LEGEND_TEXT_COLOR);

if (LEGEND_TITLE_TEXT != null) {
    TextTitle legendTitle = new TextTitle();
    legendTitle.setText(LEGEND_TITLE_TEXT);
    legendTitle.setPosition(LEGEND_POSITION);
    legendTitle.setPaint(LEGEND_TITLE_COLOR);
    legendTitle.setFont(LEGEND_TITLE_FORMAT);
    legendTitle.setHorizontalAlignment(HorizontalAlignment.CENTER);
    legendTitle.setVerticalAlignment(VerticalAlignment.CENTER);
    chart.addSubtitle(1, legendTitle);
}

当我运行示例和上面的图例代码时,我得到以下输出。

我确实注意到图例标题显示不正确,因为它垂直而不是水平放置在右侧的图例容器中(如下图所示的预期输出)。我确实尝试了几个步骤,例如使用 TextUtils.drawRotatedString() 和 TextUtils.drawAlignedString() 但无法修复图例标题位置及其对齐方式。

如何将图例标题放在图例容器顶部并水平对齐?

我正在寻找如下图例标题的类似输出,它是使用不同的图表框架生成的。

我想对齐和定位我的图例标题,如上面的输出所示。

【问题讨论】:

  • @trashgod 添加了图例标题对齐和标题位置的预期输出。
  • 另请参阅example,也可以查看demo
  • @trashgod 该示例显示将图例添加为单独的面板,这不是我的用例。在我的问题中,第一张图片显示图表中的图例,但标题图例本身并未显示在图例容器的顶部。这是我的问题。
  • 对;演示中的那个看起来更像你的模型;更多here.
  • @trashgod 因为,图例标题是一个 TextTitle 实例。我们可以旋转它并改变它的 X 和 Y 位置吗?有可能吗?

标签: java legend jfreechart


【解决方案1】:

基于此link 中提供的示例,我修改了代码以使用BlockContainer 添加自定义图例,以获得所需的输出,如上述问题的图 1 所示。

更新代码:

//Legend default properties
pro tected static final boolean LEGEND_ON = true;
private static final RectangleEdge LEGEND_POSITION = RectangleEdge.RIGHT;
private static final String LEGEND_TITLE_TEXT = "Legend";
private static final Font LEGEND_TITLE_FORMAT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
private static final Color LEGEND_TITLE_COLOR = Color.BLACK;
private static final double LEGEND_MAX_WIDTH = 0.0;
private static final Color LEGEND_BG_COLOR = Color.WHITE;
private static final Color LEGEND_BORDER_COLOR = Color.WHITE;
private static final Font LEGEND_TEXT_FORMAT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
private static final Color LEGEND_TEXT_COLOR = Color.BLACK;

LegendTitle legend = chart.getLegend();
legend.setPosition(LEGEND_POSITION);
legend.setWidth(LEGEND_MAX_WIDTH);
legend.setBackgroundPaint(LEGEND_BG_COLOR);
legend.setFrame(new BlockBorder(1, 1, 1, 1, LEGEND_BORDER_COLOR));
legend.setItemFont(LEGEND_TEXT_FORMAT);
legend.setItemPaint(LEGEND_TEXT_COLOR);

if (LEGEND_TITLE_TEXT != null) {
    TextTitle legendTitle = new TextTitle();
    legendTitle.setText(LEGEND_TITLE_TEXT);
    legendTitle.setPosition(LEGEND_POSITION);
    legendTitle.setPaint(LEGEND_TITLE_COLOR);
    legendTitle.setFont(LEGEND_TITLE_FORMAT);
    legendTitle.setHorizontalAlignment(HorizontalAlignment.CENTER);
    legendTitle.setVerticalAlignment(VerticalAlignment.CENTER);

    BlockContainer legendCont = new BlockContainer(new ColumnArrangement());
    legendCont.add(legendTitle, RectangleEdge.TOP);
    BlockContainer items = legend.getItemContainer();
    legendCont.add(items);      
    legend.setWrapper(legendCont);
    //Remove existing legend to avoid duplicate legend display.
    chart.removeLegend();
    //show legend container with title and items
    chart.addSubtitle(legend);
}

执行上述代码后,得到如下输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多