|
| 1 | +import 'dart:typed_data'; |
| 2 | +import 'dart:io'; |
| 3 | + |
| 4 | +import 'package:flutter/material.dart'; |
| 5 | +import 'package:path_provider/path_provider.dart'; |
| 6 | + |
| 7 | +import 'package:flutter_wordcloud/flutter_wordcloud.dart'; |
| 8 | + |
| 9 | +// 键值对数据 |
| 10 | +final jourData = { |
| 11 | + "JOURNAL OF CLEANER PRODUCTION": 47, |
| 12 | + "SUSTAINABILITY": 32, |
| 13 | + "SCIENCE OF THE TOTAL ENVIRONMENT": 28, |
| 14 | + "AMA-AGRICULTURAL MECHANIZATION IN ASIA AFRICA AND LATIN AMERICA": 19, |
| 15 | + "ENVIRONMENTAL SCIENCE AND POLLUTION RESEARCH": 17, |
| 16 | + "JOURNAL OF ENVIRONMENTAL MANAGEMENT": 16, |
| 17 | + "AGRICULTURE ECOSYSTEMS & ENVIRONMENT": 15, |
| 18 | + "AGRONOMY-BASEL": 12, |
| 19 | + "SCIENTIFIC REPORTS": 11, |
| 20 | + "AGRICULTURE-BASEL": 10, |
| 21 | + "ENVIRONMENTAL RESEARCH LETTERS": 10, |
| 22 | + "SOIL & TILLAGE RESEARCH": 8, |
| 23 | + "GLOBAL CHANGE BIOLOGY": 8, |
| 24 | + "AGRICULTURAL SYSTEMS": 7, |
| 25 | + "GEODERMA": 7, |
| 26 | + "FRONTIERS IN ENVIRONMENTAL SCIENCE": 7, |
| 27 | + "BIOGEOSCIENCES": 7, |
| 28 | + "ECOLOGICAL INDICATORS": 6, |
| 29 | + "INTERNATIONAL JOURNAL OF LIFE CYCLE ASSESSMENT": 6, |
| 30 | + "ATMOSPHERIC CHEMISTRY AND PHYSICS": 6, |
| 31 | + "FRONTIERS IN SUSTAINABLE FOOD SYSTEMS": 5, |
| 32 | + "ATMOSPHERIC ENVIRONMENT": 5, |
| 33 | + "SOIL BIOLOGY & BIOCHEMISTRY": 5, |
| 34 | + "MITIGATION AND ADAPTATION STRATEGIES FOR GLOBAL CHANGE": 5, |
| 35 | + "FIELD CROPS RESEARCH": 5, |
| 36 | + "SOIL SCIENCE SOCIETY OF AMERICA JOURNAL": 5, |
| 37 | + "NATURE COMMUNICATIONS": 5, |
| 38 | + "FRESENIUS ENVIRONMENTAL BULLETIN": 4, |
| 39 | + "ENVIRONMENT DEVELOPMENT AND SUSTAINABILITY": 4, |
| 40 | + "NUTRIENT CYCLING IN AGROECOSYSTEMS": 4, |
| 41 | + "SUSTAINABLE PRODUCTION AND CONSUMPTION": 4, |
| 42 | + "BIOMASS CONVERSION AND BIOREFINERY": 4, |
| 43 | + "RENEWABLE & SUSTAINABLE ENERGY REVIEWS": 4, |
| 44 | + "PLOS ONE": 4, |
| 45 | + "GLOBAL CHANGE BIOLOGY BIOENERGY": 4, |
| 46 | + "ENVIRONMENTAL POLLUTION": 4, |
| 47 | + "REGIONAL ENVIRONMENTAL CHANGE": 4, |
| 48 | + "FORESTS": 4, |
| 49 | + "LAND DEGRADATION & DEVELOPMENT": 4, |
| 50 | + "HELIYON": 3, |
| 51 | + "ARCHIVES OF AGRONOMY AND SOIL SCIENCE": 3, |
| 52 | + "ENVIRONMENTAL TECHNOLOGY & INNOVATION": 3, |
| 53 | + "ANTHROPOCENE": 3, |
| 54 | + "PLANT AND SOIL": 3, |
| 55 | + "JOURNAL OF SOILS AND SEDIMENTS": 3, |
| 56 | + "AGRICULTURAL WATER MANAGEMENT": 3, |
| 57 | + "JOURNAL OF THE SCIENCE OF FOOD AND AGRICULTURE": 3, |
| 58 | + "ENERGIES": 3, |
| 59 | + "PEDOSPHERE": 3, |
| 60 | + "SOIL USE AND MANAGEMENT": 3, |
| 61 | + "PLANTS-BASEL": 3, |
| 62 | + "CANADIAN JOURNAL OF SOIL SCIENCE": 2, |
| 63 | + "EARTHS FUTURE": 2, |
| 64 | + "EUROPEAN JOURNAL OF AGRONOMY": 2, |
| 65 | + "INDUSTRIAL CROPS AND PRODUCTS": 2, |
| 66 | + "RESOURCES CONSERVATION AND RECYCLING": 2, |
| 67 | + "COMMUNICATIONS IN SOIL SCIENCE AND PLANT ANALYSIS": 2, |
| 68 | + "GLOBAL ENVIRONMENTAL CHANGE-HUMAN AND POLICY DIMENSIONS": 2, |
| 69 | + "APPLIED SCIENCES-BASEL": 2, |
| 70 | + "APPLIED SOIL ECOLOGY": 2, |
| 71 | + "EUROPEAN JOURNAL OF SOIL SCIENCE": 2, |
| 72 | + "JOURNAL OF HYDROLOGY": 2, |
| 73 | + "CATENA": 2, |
| 74 | + "JOURNAL OF MATERIALS RESEARCH AND TECHNOLOGY-JMR&T": 2, |
| 75 | + "FOOD POLICY": 2, |
| 76 | + "JOURNAL OF FOREST ECONOMICS": 2, |
| 77 | + "ENVIRONMENT INTERNATIONAL": 2, |
| 78 | + "SOIL SCIENCE AND PLANT NUTRITION": 2, |
| 79 | + "DESALINATION AND WATER TREATMENT": 2, |
| 80 | + "ECOLOGICAL ECONOMICS": 2, |
| 81 | + "INTERNATIONAL JOURNAL OF ENVIRONMENTAL SCIENCE AND TECHNOLOGY": 2, |
| 82 | + "ENVIRONMENTAL SCIENCE & POLICY": 2, |
| 83 | + "ACS OMEGA": 2, |
| 84 | + "INTERNATIONAL JOURNAL OF ENVIRONMENTAL RESEARCH AND PUBLIC HEALTH": 2, |
| 85 | + "INTERNATIONAL JOURNAL OF AGRICULTURAL AND BIOLOGICAL ENGINEERING": 2, |
| 86 | + "FRONTIERS IN PLANT SCIENCE": 2, |
| 87 | + "PROCEEDINGS OF THE NATIONAL ACADEMY OF SCIENCES OF THE UNITED STATES OF": 2, |
| 88 | + "INTERNATIONAL SOIL AND WATER CONSERVATION RESEARCH": 2, |
| 89 | + "RANGELAND JOURNAL": 2, |
| 90 | + "SCIENCE": 2, |
| 91 | + "GLOBAL BIOGEOCHEMICAL CYCLES": 2, |
| 92 | + "ENVIRONMENTAL DEVELOPMENT": 2, |
| 93 | + "ANIMAL PRODUCTION SCIENCE": 2, |
| 94 | + "FOREST ECOSYSTEMS": 2, |
| 95 | + "FOREST POLICY AND ECONOMICS": 2, |
| 96 | + "IFOREST-BIOGEOSCIENCES AND FORESTRY": 2, |
| 97 | + "AGRONOMY FOR SUSTAINABLE DEVELOPMENT": 2, |
| 98 | + "FOREST ECOLOGY AND MANAGEMENT": 2, |
| 99 | + "BIOENERGY RESEARCH": 2, |
| 100 | + "JOURNAL OF ENVIRONMENTAL QUALITY": 2, |
| 101 | + "INTERNATIONAL JOURNAL OF GREENHOUSE GAS CONTROL": 2, |
| 102 | + "JOURNAL OF GEOPHYSICAL RESEARCH-BIOGEOSCIENCES": 2, |
| 103 | + "MATERIALS": 1, |
| 104 | + "IEEE JOURNAL OF SELECTED TOPICS IN APPLIED EARTH OBSERVATIONS AND REMOTE": 1, |
| 105 | + "PADDY AND WATER ENVIRONMENT": 1, |
| 106 | + "FRONTIERS IN MICROBIOLOGY": 1, |
| 107 | + "ENERGY SOURCES PART A-RECOVERY UTILIZATION AND ENVIRONMENTAL EFFECTS": 1, |
| 108 | + "PROCESSES": 1, |
| 109 | + "SCIENCE OF ADVANCED MATERIALS": 1, |
| 110 | + "SUSTAINABLE ENERGY TECHNOLOGIES AND ASSESSMENTS": 1 |
| 111 | +}; |
| 112 | +final subject = { |
| 113 | + "Environmental Sciences": 313, |
| 114 | + "Green & Sustainable Science & Technology": 104, |
| 115 | + "Soil Science": 70, |
| 116 | + "Engineering, Environmental": 67, |
| 117 | + "Agronomy": 60, |
| 118 | + "Environmental Studies": 50, |
| 119 | + "Ecology": 45, |
| 120 | + "Energy & Fuels": 41, |
| 121 | + "Multidisciplinary Sciences": 35, |
| 122 | + "Agriculture, Multidisciplinary": 34, |
| 123 | + "Meteorology & Atmospheric Sciences": 33, |
| 124 | + "Geosciences, Multidisciplinary": 32, |
| 125 | + "Plant Sciences": 29, |
| 126 | + "Agricultural Engineering": 28, |
| 127 | + "Forestry": 21, |
| 128 | + "Food Science & Technology": 19, |
| 129 | + "Biodiversity Conservation": 18, |
| 130 | + "Water Resources": 18, |
| 131 | + "Engineering, Chemical": 14, |
| 132 | + "Economics": 12, |
| 133 | + "Biotechnology & Applied Microbiology": 11, |
| 134 | + "Materials Science, Multidisciplinary": 11, |
| 135 | + "Chemistry, Multidisciplinary": 9, |
| 136 | + "Chemistry, Analytical": 8, |
| 137 | + "Chemistry, Applied": 7, |
| 138 | + "Agricultural Economics & Policy": 6, |
| 139 | + "Chemistry, Physical": 6, |
| 140 | + "Public, Environmental & Occupational Health": 5, |
| 141 | + "Engineering, Electrical & Electronic": 5, |
| 142 | + "Geography, Physical": 5, |
| 143 | + "Physics, Applied": 5, |
| 144 | + "Engineering, Civil": 4, |
| 145 | + "Agriculture, Dairy & Animal Science": 4, |
| 146 | + "Metallurgy & Metallurgical Engineering": 4, |
| 147 | + "Marine & Freshwater Biology": 3, |
| 148 | + "Thermodynamics": 3, |
| 149 | + "Remote Sensing": 3, |
| 150 | + "Imaging Science & Photographic Technology": 3, |
| 151 | + "Nanoscience & Nanotechnology": 3, |
| 152 | + "Nutrition & Dietetics": 3, |
| 153 | + "Biochemistry & Molecular Biology": 2, |
| 154 | + "Engineering, Multidisciplinary": 2, |
| 155 | + "Construction & Building Technology": 2, |
| 156 | + "Instruments & Instrumentation": 2, |
| 157 | + "Biology": 2, |
| 158 | + "Fisheries": 2, |
| 159 | + "Mathematics, Interdisciplinary Applications": 2, |
| 160 | + "Geography": 2, |
| 161 | + "Polymer Science": 2, |
| 162 | + "Mining & Mineral Processing": 2, |
| 163 | + "Toxicology": 2, |
| 164 | + "Mathematical & Computational Biology": 1, |
| 165 | + "Biochemical Research Methods": 1, |
| 166 | + "Limnology": 1, |
| 167 | + "Spectroscopy": 1, |
| 168 | + "Microbiology": 1, |
| 169 | + "Operations Research & Management Science": 1, |
| 170 | + "Physics, Condensed Matter": 1, |
| 171 | + "Physics, Mathematical": 1, |
| 172 | + "Logic": 1, |
| 173 | + "Entomology": 1, |
| 174 | + "Astronomy & Astrophysics": 1, |
| 175 | + "Materials Science, Ceramics": 1, |
| 176 | + "Mathematics, Applied": 1, |
| 177 | + "Chemistry, Inorganic & Nuclear": 1, |
| 178 | + "Biophysics": 1, |
| 179 | + "Electrochemistry": 1, |
| 180 | + "Computer Science, Artificial Intelligence": 1, |
| 181 | + "Computer Science, Interdisciplinary Applications": 1, |
| 182 | + "Engineering, Mechanical": 1, |
| 183 | + "Mechanics": 1, |
| 184 | + "Automation & Control Systems": 1, |
| 185 | + "Veterinary Sciences": 1, |
| 186 | + "Computer Science, Information Systems": 1, |
| 187 | + "Telecommunications": 1, |
| 188 | + "Management": 1, |
| 189 | + "Materials Science, Composites": 1, |
| 190 | + "Nuclear Science & Technology": 1, |
| 191 | + "Computer Science, Theory & Methods": 1, |
| 192 | + "Chemistry, Organic": 1 |
| 193 | +}; |
| 194 | +final research = { |
| 195 | + "Agriculture": 186, |
| 196 | + "Science & Technology - Other Topics": 141, |
| 197 | + "Engineering": 90, |
| 198 | + "Environmental Sciences": 49, |
| 199 | + "Energy & Fuels": 40, |
| 200 | + "Geology": 31, |
| 201 | + "Chemistry": 30, |
| 202 | + "Plant Sciences": 29, |
| 203 | + "Meteorology & Atmospheric Sciences": 29, |
| 204 | + "Forestry": 21, |
| 205 | + "Food Science & Technology": 19, |
| 206 | + "Biodiversity & Conservation": 18, |
| 207 | + "Water Resources": 18, |
| 208 | + "Materials Science": 13, |
| 209 | + "Business & Economics": 12, |
| 210 | + "Biotechnology & Applied Microbiology": 11, |
| 211 | + "Physical Geography": 5, |
| 212 | + "Physics": 5, |
| 213 | + "Public, Environmental & Occupational": 4, |
| 214 | + "Metallurgy & Metallurgical Engineering": 4, |
| 215 | + "Meteorology & Atmospheric": 4, |
| 216 | + "Computer Science": 3, |
| 217 | + "Environmental": 3, |
| 218 | + "Remote Sensing": 3, |
| 219 | + "Marine & Freshwater Biology": 3, |
| 220 | + "Thermodynamics": 3, |
| 221 | + "Mathematics": 3, |
| 222 | + "Biochemistry & Molecular Biology": 3, |
| 223 | + "Fisheries": 2, |
| 224 | + "Imaging Science &": 2, |
| 225 | + "Construction & Building Technology": 2, |
| 226 | + "Toxicology": 2, |
| 227 | + "Polymer Science": 2, |
| 228 | + "Geography": 2, |
| 229 | + "Nutrition": 2, |
| 230 | + "Instruments & Instrumentation": 2, |
| 231 | + "Life Sciences & Biomedicine - Other Topics": 2, |
| 232 | + "Environmental Sciences &": 2, |
| 233 | + "Mining & Mineral Processing": 2, |
| 234 | + "Imaging": 1, |
| 235 | + "Veterinary Sciences": 1, |
| 236 | + "Spectroscopy": 1, |
| 237 | + "Public, Environmental & Occupational Health": 1, |
| 238 | + "Nutrition & Dietetics": 1, |
| 239 | + "Science & Technology -": 1, |
| 240 | + "Operations Research & Management Science": 1, |
| 241 | + "Entomology": 1, |
| 242 | + "Astronomy & Astrophysics": 1, |
| 243 | + "Nuclear Science & Technology": 1, |
| 244 | + "Biophysics": 1, |
| 245 | + "Mechanics": 1, |
| 246 | + "Automation & Control Systems": 1, |
| 247 | + "Telecommunications": 1, |
| 248 | + "Microbiology": 1, |
| 249 | + "Mathematical & Computational Biology": 1 |
| 250 | +}; |
| 251 | + |
| 252 | +// 简单的保持功能 |
| 253 | +Future<File> saveUint8ListToDesktop(Uint8List data) async { |
| 254 | + final String? desktopPath = await getDownloadsDirectory() |
| 255 | + .then((dir) => dir?.parent.path) |
| 256 | + .then((parent) => '$parent/Desktop'); |
| 257 | + |
| 258 | + final String desktop = desktopPath ?? |
| 259 | + r'C:\Users\' + Platform.environment['USERNAME']! + r'\Desktop'; |
| 260 | + |
| 261 | + final Directory desktopDir = Directory(desktop); |
| 262 | + if (!await desktopDir.exists()) { |
| 263 | + await desktopDir.create(recursive: true); |
| 264 | + } |
| 265 | + |
| 266 | + final String fullPath = |
| 267 | + "$desktop/${DateTime.now().toUtc().millisecondsSinceEpoch ~/ 1000}.png"; |
| 268 | + final File file = File(fullPath); |
| 269 | + await file.writeAsBytes(data); |
| 270 | + |
| 271 | + debugPrint('已保存到桌面:$fullPath'); |
| 272 | + return file; |
| 273 | +} |
| 274 | + |
| 275 | +void main() { |
| 276 | + runApp(const DemoApp()); |
| 277 | +} |
| 278 | + |
| 279 | +class DemoApp extends StatelessWidget { |
| 280 | + const DemoApp({super.key}); |
| 281 | + |
| 282 | + @override |
| 283 | + Widget build(BuildContext context) { |
| 284 | + return MaterialApp( |
| 285 | + home: Scaffold( |
| 286 | + appBar: AppBar(title: const Text("WordCloud 形状演示")), |
| 287 | + body: SingleChildScrollView( |
| 288 | + child: Padding( |
| 289 | + padding: const EdgeInsets.all(20.0), |
| 290 | + child: Column( |
| 291 | + children: [ |
| 292 | + _buildExample(jourData, '期刊统计', GradientTheme.coolGray, |
| 293 | + ColorMapTheme.mono, minFontSize: 10), |
| 294 | + _buildExample(subject, '学科统计', GradientTheme.sunset, |
| 295 | + ColorMapTheme.turboColors, minFontSize: 16), |
| 296 | + _buildExample(research, '研究领域统计', GradientTheme.greenCyan, |
| 297 | + ColorMapTheme.scientificColors, minFontSize: 20,), |
| 298 | + ], |
| 299 | + ), |
| 300 | + ), |
| 301 | + ), |
| 302 | + ), |
| 303 | + ); |
| 304 | + } |
| 305 | + |
| 306 | + Future<void> savePng(WordCloudLogic wc) async { |
| 307 | + final data = await wc.exportToPngBytes(ratio: 3); |
| 308 | + await saveUint8ListToDesktop(data); |
| 309 | + } |
| 310 | + |
| 311 | + Widget _buildExample(Map<String, int> datas, String title, Gradient gradient, |
| 312 | + List<Color> colorMap, |
| 313 | + {Offset? wordSpacing, double? minFontSize, double? maxFontSize}) { |
| 314 | + final wc = WordCloudLogic( |
| 315 | + datas, |
| 316 | + width: 1600, |
| 317 | + height: 1000, |
| 318 | + minFontSize: minFontSize ?? 10, |
| 319 | + maxFontSize: maxFontSize, |
| 320 | + backgroundGradient: gradient, |
| 321 | + coloMap: colorMap, |
| 322 | + wordSpacing: wordSpacing, |
| 323 | + ); |
| 324 | + |
| 325 | + return Column( |
| 326 | + children: [ |
| 327 | + Row( |
| 328 | + children: [ |
| 329 | + Text( |
| 330 | + title, |
| 331 | + style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), |
| 332 | + ), |
| 333 | + IconButton( |
| 334 | + onPressed: () async => savePng(wc), |
| 335 | + icon: const Icon(Icons.save)) |
| 336 | + ], |
| 337 | + ), |
| 338 | + const SizedBox(height: 15), |
| 339 | + Container( |
| 340 | + decoration: BoxDecoration( |
| 341 | + border: Border.all(color: Colors.grey.shade300, width: 2), |
| 342 | + borderRadius: BorderRadius.circular(8), |
| 343 | + ), |
| 344 | + child: WordCloudView(cloud: wc), |
| 345 | + ), |
| 346 | + ], |
| 347 | + ); |
| 348 | + } |
| 349 | +} |
0 commit comments