Claude和ChatGPT做了一些可视化图表,我应该如何保存下来


类似于这种,可以互动的图表,我Google了一下挺复杂了 大佬们有没有什么优雅的方案。

目的是想把这个图表保存下来 和笔记的形式一样,目前有什么笔记软件可以进行实时运行这个代码块?

11 Likes

应该是用代码写的,你让他提供代码就行了

5 Likes

另存为html文件吧。互动的图表大概就是引入了echarts之类的库吧。毕竟真正的BI分析,html也做不出来啊。

1 Like

claude的web端是吧。调用了artifacts,看右上角可以复制代码或者下载格式文件的。

右下角下载呢

不好意思,我的问题没有问题清楚 我重新更改了一下

目的是想把这个图表保存下来 和笔记的形式一样,目前有什么笔记软件可以进行实时运行这个代码块?

1 Like

我帮你问下这方面专家

@bbb

@unique

@XiaoHuang

2 Likes

谢谢 !

很荣幸被你@,但是可以预览的html的笔记文件,我还真不知道,我去搜索看看

1 Like

我觉得你肯定知道的(★ω★)+.*。

(因为你有蓝色勾)

2 Likes

:tieba_087: 应该是HTML然后用的echarts,可以保存成HTML代码,但是保存成笔记可互动的?还真不知道

1 Like

HTML都好保存 主要是这个数据的代码块不知道如何保存好

数据块的,让直接给JSON,然后外链一个JSON?

1 Like

搜了半天没找到相关文件,但是看到你说数据块,不如这样,你用大善人呢,用worker新建一个页面,数据存储在kv空间里面,然后自定义个域名,现在估计域名也有免费的,刚看了一下notion支持外链展示,这样如何呢

1 Like

把这个artifact共享(publish)出来让佬友们看看是怎样的,或许能更好地给建议

2 Likes

我自己感觉可能比佬们想的要更难一些

import React, { useState, useEffect } from 'react';
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, LineChart, Line } from 'recharts';
import Papa from 'papaparse';
import _ from 'lodash';

const PackagePriceAnalysis = () => {
  const [analysisData, setAnalysisData] = useState(null);
  
  useEffect(() => {
    const analyzeData = async () => {
      const fileContent = await window.fs.readFile('data.csv', { encoding: 'utf8' });
      const parsedData = Papa.parse(fileContent, {
        header: true,
        skipEmptyLines: true,
        dynamicTyping: true
      });

      function extractPackageSize(title) {
        const pairMatches = title.toLowerCase().match(/(\d+)er-pack|(\d+)er pack|(\d+) paar/);
        if (pairMatches) {
          const quantity = parseInt(pairMatches[1] || pairMatches[2] || pairMatches[3]);
          return quantity > 0 ? quantity : 1;
        }
        return 1;
      }

      const products = parsedData.data.map(product => {
        const quantity = extractPackageSize(product['商品名称']);
        return {
          ...product,
          quantity,
          pricePerPair: product['平均售价(EUR)'] / quantity
        };
      });

      const packageSizes = _.groupBy(products, 'quantity');
      
      const analysis = Object.entries(packageSizes).map(([size, items]) => ({
        size: parseInt(size),
        count: items.length,
        avgTotalPrice: _.meanBy(items, '平均售价(EUR)'),
        avgPricePerPair: _.meanBy(items, 'pricePerPair'),
        avgSearchVolume: _.meanBy(items, '搜索点击量(过去 360 天)'),
        avgRating: _.meanBy(items, '平均评分')
      })).sort((a, b) => a.size - b.size);

      setAnalysisData(analysis);
    };

    analyzeData();
  }, []);

  if (!analysisData) return <div>Loading...</div>;

  return (
    <div className="w-full p-4">
      <h2 className="text-2xl font-bold mb-6">包装组合价格分析</h2>
      
      <div className="grid grid-cols-1 gap-8">
        <div className="bg-white rounded-lg p-4 shadow">
          <h3 className="text-lg font-semibold mb-4">单双价格与包装数量关系</h3>
          <div className="h-64">
            <ResponsiveContainer width="100%" height="100%">
              <LineChart data={analysisData}>
                <CartesianGrid strokeDasharray="3 3" />
                <XAxis dataKey="size" label={{ value: '包装数量', position: 'bottom' }} />
                <YAxis label={{ value: '价格 (EUR)', angle: -90, position: 'left' }} />
                <Tooltip />
                <Legend />
                <Line type="monotone" dataKey="avgPricePerPair" name="平均单双价格" stroke="#8884d8" />
                <Line type="monotone" dataKey="avgTotalPrice" name="平均总价" stroke="#82ca9d" />
              </LineChart>
            </ResponsiveContainer>
          </div>
        </div>

        <div className="bg-white rounded-lg p-4 shadow">
          <h3 className="text-lg font-semibold mb-4">搜索量与评分分布</h3>
          <div className="h-64">
            <ResponsiveContainer width="100%" height="100%">
              <BarChart data={analysisData}>
                <CartesianGrid strokeDasharray="3 3" />
                <XAxis dataKey="size" />
                <YAxis yAxisId="left" orientation="left" stroke="#8884d8" />
                <YAxis yAxisId="right" orientation="right" stroke="#82ca9d" />
                <Tooltip />
                <Legend />
                <Bar yAxisId="left" dataKey="avgSearchVolume" name="平均搜索量" fill="#8884d8" />
                <Bar yAxisId="right" dataKey="avgRating" name="平均评分" fill="#82ca9d" />
              </BarChart>
            </ResponsiveContainer>
          </div>
        </div>

        <div className="overflow-x-auto">
          <table className="min-w-full bg-white">
            <thead>
              <tr className="bg-gray-50">
                <th className="px-4 py-2">包装数量</th>
                <th className="px-4 py-2">商品数</th>
                <th className="px-4 py-2">平均单双价格</th>
                <th className="px-4 py-2">平均总价</th>
                <th className="px-4 py-2">平均搜索量</th>
                <th className="px-4 py-2">平均评分</th>
              </tr>
            </thead>
            <tbody>
              {analysisData.map((item) => (
                <tr key={item.size} className="border-t">
                  <td className="px-4 py-2">{item.size}双装</td>
                  <td className="px-4 py-2">{item.count}</td>
                  <td className="px-4 py-2">€{item.avgPricePerPair.toFixed(2)}</td>
                  <td className="px-4 py-2">€{item.avgTotalPrice.toFixed(2)}</td>
                  <td className="px-4 py-2">{item.avgSearchVolume.toFixed(0)}</td>
                  <td className="px-4 py-2">{item.avgRating.toFixed(2)}</td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      </div>
    </div>
  );
};

export default PackagePriceAnalysis;

claude 写的是 react ,需要支持 react 的环境的。

1 Like

发出来了,我我看他还需要某一些环境和插件

我已经把代码发出来了

我发呆吗出来了