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 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 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 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 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 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 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()); } } }