You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

165 lines
6.1 KiB

package com.project.chart;
import com.project.analyzer.PostAnalyzer;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import javax.imageio.ImageIO;
public class SimpleChartGenerator {
private static final String OUTPUT_DIR = "d:\\java\\project\\charts";
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
public static void generateAllCharts(PostAnalyzer analyzer) {
try {
Files.createDirectories(Paths.get(OUTPUT_DIR));
generateSentimentChart(analyzer);
generateEngagementChart(analyzer);
generateAuthorChart(analyzer);
System.out.println("\n所有图表已生成,保存在: " + OUTPUT_DIR);
} catch (IOException e) {
System.err.println("创建图表目录时出错: " + e.getMessage());
}
}
public static void generateSentimentChart(PostAnalyzer analyzer) {
Map<String, Long> data = analyzer.getSentimentDistributionData();
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("宋体", Font.BOLD, 24));
g2d.drawString("情感倾向分布", 300, 40);
int barWidth = 150;
int startX = 200;
int startY = 500;
int maxHeight = 400;
long maxValue = data.values().stream().max(Long::compare).orElse(1L);
int index = 0;
for (Map.Entry<String, Long> entry : data.entrySet()) {
int barHeight = (int) ((entry.getValue() * 1.0 / maxValue) * maxHeight);
g2d.setColor(new Color(70, 130, 180));
g2d.fillRect(startX + index * (barWidth + 50), startY - barHeight, barWidth, barHeight);
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("宋体", Font.PLAIN, 14));
g2d.drawString(entry.getKey(), startX + index * (barWidth + 50) + 50, startY + 20);
g2d.drawString(String.valueOf(entry.getValue()), startX + index * (barWidth + 50) + 60, startY - barHeight - 5);
index++;
}
g2d.dispose();
saveImage(image, "sentiment_distribution.png");
}
public static void generateEngagementChart(PostAnalyzer analyzer) {
Map<String, Double> data = analyzer.getEngagementData();
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("宋体", Font.BOLD, 24));
g2d.drawString("互动指标分析", 300, 40);
int barWidth = 150;
int startX = 200;
int startY = 500;
int maxHeight = 400;
double maxValue = data.values().stream().max(Double::compare).orElse(1.0);
int index = 0;
for (Map.Entry<String, Double> entry : data.entrySet()) {
int barHeight = (int) ((entry.getValue() / maxValue) * maxHeight);
g2d.setColor(new Color(60, 179, 113));
g2d.fillRect(startX + index * (barWidth + 50), startY - barHeight, barWidth, barHeight);
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("宋体", Font.PLAIN, 14));
g2d.drawString(entry.getKey(), startX + index * (barWidth + 50) + 60, startY + 20);
g2d.drawString(String.format("%.1f", entry.getValue()), startX + index * (barWidth + 50) + 50, startY - barHeight - 5);
index++;
}
g2d.dispose();
saveImage(image, "engagement_metrics.png");
}
public static void generateAuthorChart(PostAnalyzer analyzer) {
Map<String, Integer> data = analyzer.getAuthorPostCount();
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("宋体", Font.BOLD, 24));
g2d.drawString("热门作者排行TOP10", 280, 40);
int barHeight = 35;
int startY = 80;
int startX = 200;
int maxWidth = 500;
int maxValue = data.values().stream().max(Integer::compare).orElse(1);
int index = 0;
for (Map.Entry<String, Integer> entry : data.entrySet()) {
int barWidth = (int) ((entry.getValue() * 1.0 / maxValue) * maxWidth);
g2d.setColor(new Color(255, 140, 0));
g2d.fillRect(startX, startY + index * (barHeight + 10), barWidth, barHeight);
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("宋体", Font.PLAIN, 12));
String author = entry.getKey();
if (author.length() > 15) {
author = author.substring(0, 15) + "...";
}
g2d.drawString(author, 50, startY + index * (barHeight + 10) + 23);
g2d.drawString(String.valueOf(entry.getValue()), startX + barWidth + 10, startY + index * (barHeight + 10) + 23);
index++;
}
g2d.dispose();
saveImage(image, "author_ranking.png");
}
private static void saveImage(BufferedImage image, String filename) {
try {
File file = new File(OUTPUT_DIR, filename);
ImageIO.write(image, "PNG", file);
System.out.println("图表已保存: " + file.getAbsolutePath());
} catch (IOException e) {
System.err.println("保存图表失败: " + e.getMessage());
}
}
}