鱼C论坛

 找回密码
 立即注册
查看: 111|回复: 26

实现数据可视化

[复制链接]
发表于 2024-5-27 09:33:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在web页面实现各国经济的展示,以柱状图展示,展示数据数据库给出,数据库的内容自己编辑,展示的动图要有一定的科技感@fishc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-5-30 18:57:46 | 显示全部楼层
@fish
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 18:57:55 | 显示全部楼层


嗨!有什么问题或者困惑我可以帮助解答吗?编程初学者常常面临各种难题,无论是语法问题还是算法问题,只要你告诉我具体的问题,我会尽力给出易懂且幽默的解答。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-30 19:12:43 | 显示全部楼层
FishC 发表于 2024-5-30 18:57
嗨!有什么问题或者困惑我可以帮助解答吗?编程初学者常常面临各种难题,无论是语法问题还是算法问题, ...

"""数据可视化,歌单介绍词云图"""
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import pandas as pd
import jieba
import time


def data_visualization_of_music_wordcloud():
    """歌单介绍词云图"""
    df = pd.read_csv('music_data/music_detail.csv', header=None)
    text = ''

    print("正在生成歌单介绍词云图片...")

    # 输出进度条
    t = 60
    start = time.perf_counter()

    for i in range(t + 1):
        finsh = "▓" * i
        need_do = "-" * (t - i)
        progress = (i / t) * 100
        dur = time.perf_counter() - start

        print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(progress, finsh, need_do, dur), end="")

        time.sleep(0.02)

    for line in df[2]:
        text += ' '.join(jieba.cut(line, cut_all=False))

    background_image = plt.imread('music_image/img/background_image.jpg')

    stopwords = set('')
    stopwords.update(
        ['封面', 'none介绍', '介绍', '歌单', '歌曲', '我们', '自己', '没有', '就是', '可以', '知道', '一起', '不是',
         '因为', '什么', '时候', '还是', '如果', '不要', '那些', '那么', '那个', '所有', '一样', '一直', '不会', '现在',
         '他们', '这样', '最后', '这个', '只是', '有些', '其实', '开始', '曾经', '所以', '不能', '你们', '已经', '后来',
         '一切', '一定', '这些', '一些', '只有', '还有'])

    wc = WordCloud(
        background_color='white',
        mask=background_image,
        font_path='./font_resources/STZHONGS.ttf',
        max_words=2000,
        max_font_size=150,
        random_state=30,
        stopwords=stopwords
    )
    wc.generate_from_text(text)

    # 看看词频高的有哪些,把无用信息去除
    process_word = WordCloud.process_text(wc, text)
    sort = sorted(process_word.items(), key=lambda e: e[1], reverse=True)
    # print(sort[:50])

    img_colors = ImageColorGenerator(background_image)
    wc.recolor(color_func=img_colors)
    plt.imshow(wc)
    plt.axis('off')

    # 保存图片
    wc.to_file("./music_image/music_wordcloud.png")

    # 显示图片
    plt.show()

    print("\n已生成歌单介绍词云图片,保存至 music_image/music_wordcloud.png")
解释代码,给上注释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 19:13:55 | 显示全部楼层
豪在这学python 发表于 2024-05-30 19:12
"""数据可视化,歌单介绍词云图"""
from wordcloud i ...


这段代码实现了一个歌单介绍词云图的数据可视化。下面我将对代码进行解释,并给出一些注释。
"""数据可视化,歌单介绍词云图"""
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import pandas as pd
import jieba
import time

def data_visualization_of_music_wordcloud():
    """歌单介绍词云图"""
    df = pd.read_csv('music_data/music_detail.csv', header=None)
    text = ''

    print("正在生成歌单介绍词云图片...")

    # 输出进度条
    t = 60
    start = time.perf_counter()

    for i in range(t + 1):
        finsh = "■" * i
        need_do = "□" * (t - i)
        progress = (i / t) * 100
        dur = time.perf_counter() - start

        print("\r{:^3.0f}% |{}{}| {:.2f}s".format(progress, finsh, need_do, dur), end="")

        time.sleep(0.02)

    for line in df:
        text += ' '.join(jieba.cut(line, cut_all=False))

    background_image = plt.imread('music_image/img/background_image.jpg')

    stopwords = set('')
    stopwords.update([])

    wc = WordCloud(
        background_color='white',
        mask=background_image,
        font_path='./font_resources/STZHONGS.ttf',
        max_words=2000,
        max_font_size=150,
        random_state=30,
        stopwords=stopwords
    )
    wc.generate_from_text(text)

    # 看看词频高的有哪些,把无用信息去除
    process_word = WordCloud.process_text(wc, text)
    sort = sorted(process_word.items(), key=lambda e: e[1], reverse=True)
    # print(sort)

    img_colors = ImageColorGenerator(background_image)
    wc.recolor(color_func=img_colors)
    plt.imshow(wc)
    plt.axis('off')

    # 保存图片
    wc.to_file("./music_image/music_wordcloud.png")

    # 显示图片
    plt.show()

    print("\n已生成歌单介绍词云图片,保存至 music_image/music_wordcloud.png")

1. 导入了所需的库,包括WordCloud(词云图生成库)、ImageColorGenerator(用于为词云图上色)、matplotlib.pyplot(用于显示和保存图像)等。
2. `data_visualization_of_music_wordcloud()`是一个函数,表示生成歌单介绍词云图。
3. 打开了一个CSV文件(`music_data/music_detail.csv`),将其中的数据读取到一个`DataFrame`(`df`)中。
4. 通过使用`jieba`库,将歌单介绍进行分词并拼接成一个长文本(`text`)。
5. 加载背景图片(`background_image`)。
6. 定义了一个停用词集合(`stopwords`),用于过滤一些常见的无意义词汇。
7. 创建了一个`WordCloud`对象(`wc`),设置了各种参数,如背景颜色、字体路径、最大词数等。
8. 通过调用`generate_from_text()`方法,将处理好的文本生成词云图。
9. 处理生成的词云图,通过定义图片颜色生成器(`img_colors`),为词云图上色。
10. 使用`imshow()`方法,显示词云图,并关闭坐标轴。
11. 调用`to_file()`方法,将生成的词云图保存到本地(`./music_image/music_wordcloud.png`)。
12. 调用`show()`方法显示词云图。
13. 最后输出提示信息,表明词云图生成成功并保存在指定路径下。

希望以上解释对你有帮助,如果还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-30 19:31:54 | 显示全部楼层
FishC 发表于 2024-5-30 19:13
这段代码实现了一个歌单介绍词云图的数据可视化。下面我将对代码进行解释,并给出一些注释。

我想用python对数据库中的数据进行可视化,将数据库中的数据以柱状图的形式呈现,如何完成代码?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 19:32:07 | 显示全部楼层
豪在这学python 发表于 2024-05-30 19:31
我想用python对数据库中的数据进行可视化,将数据库中 ...


要使用Python对数据库中的数据进行可视化,你可以使用以下步骤完成代码:

1. 首先,你需要安装所需的库。这里推荐使用`pandas`用于数据处理和`matplotlib`用于数据可视化。你可以使用以下命令安装它们:

  
pip install pandas matplotlib

2. 导入所需的库:

  
import pandas as pd
    import matplotlib.pyplot as plt
    import sqlite3

3. 连接到你的数据库(假设是SQLite数据库):

  
conn = sqlite3.connect('your_database.db')

4. 使用`pandas`读取数据库中的数据,并将它存储到一个DataFrame对象中:

  
query = "SELECT column1, column2 FROM your_table"
    df = pd.read_sql_query(query, conn)

   注意替换`column1`、`column2`和`your_table`为你实际的列名和表名。

5. 利用`pandas`提供的功能和`matplotlib`绘制柱状图:

  
df.plot(kind='bar', x='column1', y='column2')
    plt.xlabel('X Label')
    plt.ylabel('Y Label')
    plt.title('Database Data Visualization')
    plt.show()

   在这里,你需要替换`column1`、`column2`为你要展示的列名,并修改`X Label`、`Y Label`、`Database Data Visualization`为你自己喜欢的标签。

6. 关闭数据库连接:

  
conn.close()

以上是一个简单的示例代码,你可以根据自己的需求进行修改和优化。希望对你有帮助!如有更多问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-30 19:37:51 | 显示全部楼层
FishC 发表于 2024-5-30 19:32
要使用Python对数据库中的数据进行可视化,你可以使用以下步骤完成代码:

1. 首先,你需要安装所需 ...

数据库用MySQL,数据库名为year,我想要将图标做成动态
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 19:38:22 | 显示全部楼层
豪在这学python 发表于 2024-05-30 19:37
数据库用MySQL,数据库名为year,我想要将图标做成动 ...


如果你想使用MySQL数据库并将图表做成动态的,你可以尝试使用以下步骤完成代码:

1. 首先,确保你已经安装了所需的库。这里我们需要安装`pandas`、`matplotlib`和`mysql-connector-python`库。你可以使用以下命令进行安装:

pip install pandas matplotlib mysql-connector-python

2. 导入所需的库:

import pandas as pd
   import matplotlib.pyplot as plt
   import mysql.connector
   import matplotlib.animation as animation

3. 连接到你的MySQL数据库:

conn = mysql.connector.connect(
       user='your_username',
       password='your_password',
       host='your_host',
       database='year'
   )

   将`your_username`、`your_password`和`your_host`替换为你实际的用户名、密码和主机。

4. 使用`pandas`读取数据库中的数据,并将其存储到一个DataFrame对象中:

query = "SELECT column1, column2 FROM your_table"
   df = pd.read_sql_query(query, conn)

   将`column1`、`column2`和`your_table`替换为你实际的列名和表名。

5. 创建一个画布和子图:

fig, ax = plt.subplots()

6. 定义一个更新图表数据的函数:

def update_data(i):
       # 在此处更新数据
       pass

   你可以在`update_data()`函数中通过查询数据库来更新数据。

7. 使用`matplotlib.animation`库创建动态图表:

ani = animation.FuncAnimation(fig, update_data, interval=1000)  # 每隔1秒更新一次数据
   plt.show()

   这将显示一个动态图表,并每隔1秒调用一次`update_data()`函数。

8. 关闭数据库连接:

conn.close()

请根据上述步骤修改代码以适应你的实际情况。希望对你有所帮助!如有更多问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-30 20:02:57 | 显示全部楼层
FishC 发表于 2024-5-30 19:38
如果你想使用MySQL数据库并将图表做成动态的,你可以尝试使用以下步骤完成代码:

1. 首先,确保你已 ...

我需要数据库中表头的第一个作为图标的x,第二个表头作为y
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 20:03:07 | 显示全部楼层
豪在这学python 发表于 2024-05-30 20:02
我需要数据库中表头的第一个作为图标的x,第二个表头 ...


如果你想使用MySQL数据库中的表头的第一个列作为x轴,第二个列作为y轴来制作动态图表,你可以按照以下步骤修改代码:

1. 在使用`pandas`读取数据时,设置`header`参数为`0`,以将第一行作为列名:
df = pd.read_sql_query(query, conn, header=0)

2. 修改`update_data()`函数来提取x和y的值,并更新图表数据:
def update_data(i):
    x = df.iloc[:, 0]  # 提取第一列作为x轴数据
    y = df.iloc[:, 1]  # 提取第二列作为y轴数据

    # 更新图表数据
    ax.clear()  # 清空原有图表
    ax.plot(x, y)  # 重新绘制图表

# 使用FuncAnimation创建动态图表
ani = animation.FuncAnimation(fig, update_data, interval=1000)

这样,每次调用`update_data()`函数时,它都会从数据框中提取第一列作为x轴数据,第二列作为y轴数据,并重新绘制图表。

希望这对你有帮助!如有更多问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-30 20:07:01 | 显示全部楼层
FishC 发表于 2024-5-30 20:03
如果你想使用MySQL数据库中的表头的第一个列作为x轴,第二个列作为y轴来制作动态图表,你可以按照以下 ...

TypeError: read_sql_query() got an unexpected keyword argument 'header'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 20:07:13 | 显示全部楼层
豪在这学python 发表于 2024-05-30 20:07
TypeError: read_sql_query() got an unexpected keyw ...


抱歉,我之前给出的代码中使用了一个不存在的`header`参数导致了错误。在`read_sql_query()`函数中,没有`header`这个参数。

要解决这个问题,你可以尝试以下方法:
1. 直接将第一行作为列名,不使用`header`参数:
df = pd.read_sql_query(query, conn)

默认情况下,`pandas`会将第一行作为列名。

2. 如果你的数据表中没有列名,只有数据,请使用`pandas`提供的`names`参数来自定义列名:
df = pd.read_sql_query(query, conn, names=['column1', 'column2'])
将`column1`和`column2`替换为实际的列名。

请根据这些修改尝试进行操作,并避免使用`header`参数。如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-30 20:11:29 | 显示全部楼层
FishC 发表于 2024-5-30 20:07
抱歉,我之前给出的代码中使用了一个不存在的`header`参数导致了错误。在`read_sql_query()`函数中,没 ...

好像不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 20:11:45 | 显示全部楼层


抱歉给出错误的建议。实际上,`read_sql_query()`函数确实没有`header`参数,它会自动将查询结果的列名作为DataFrame的列名。

在你的情况下,如果你想使用数据库中的第一列作为x轴数据,第二列作为y轴数据,你可以按照以下方式修改代码:
import pandas as pd
import matplotlib.pyplot as plt
import mysql.connector
import matplotlib.animation as animation

# 连接到MySQL数据库
conn = mysql.connector.connect(
    user='your_username',
    password='your_password',
    host='your_host',
    database='year'
)

# 从数据库中读取数据
query = "SELECT * FROM your_table"
df = pd.read_sql_query(query, conn)

# 创建一个画布和子图
fig, ax = plt.subplots()

def update_data(i):
    # 提取x和y的值
    x = df.iloc[:, 0]  # 提取第一列作为x轴数据
    y = df.iloc[:, 1]  # 提取第二列作为y轴数据

    # 更新图表数据
    ax.clear()  # 清空原有图表
    ax.plot(x, y)  # 重新绘制图表

# 使用FuncAnimation创建动态图表
ani = animation.FuncAnimation(fig, update_data, interval=1000)

# 显示图表
plt.show()

# 关闭数据库连接
conn.close()

请确保替换`your_username`、`your_password`、`your_host`为正确的用户名、密码和主机。同时,将`your_table`替换为你实际的表名。

现在,`update_data()`函数中的`x`变量提取了DataFrame中的第一列数据,`y`变量提取了第二列数据,并重新绘制图表。

希望这次能够帮到你!如有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-30 20:13:52 | 显示全部楼层
FishC 发表于 2024-5-30 20:11
抱歉给出错误的建议。实际上,`read_sql_query()`函数确实没有`header`参数,它会自动将查询结果的列名 ...

我的表为id name
             1  尔豪,现在要x轴显示id的数据,y轴显示name的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 20:15:15 | 显示全部楼层
豪在这学python 发表于 2024-05-30 20:13
我的表为id name
             1  尔豪,现在要x轴显 ...


感谢你提供的信息!根据你的描述,如果你想使用数据库表中的`id`列作为x轴数据,`name`列作为y轴数据进行绘图,你可以按照以下方式修改代码:
import pandas as pd
import matplotlib.pyplot as plt
import mysql.connector

# 连接到MySQL数据库
conn = mysql.connector.connect(
    user='your_username',
    password='your_password',
    host='your_host',
    database='year'
)

# 从数据库中读取数据
query = "SELECT id, name FROM your_table"
df = pd.read_sql_query(query, conn)

# 绘制柱状图
plt.bar(df['id'], df['name'])

# 设置x轴和y轴标签
plt.xlabel('id')
plt.ylabel('name')

# 设置图表标题
plt.title('Data Visualization')

# 显示图表
plt.show()

# 关闭数据库连接
conn.close()

在上述代码中,请确保将`your_username`、`your_password`、`your_host`替换为正确的用户名、密码和主机。同时,将`your_table`替换为你实际的表名。

这段代码会从数据库中读取`id`和`name`列的数据,然后使用`plt.bar()`函数绘制柱状图,x轴对应`id`列,y轴对应`name`列。最后设置了x轴和y轴的标签以及标题,并显示图表。

希望这次能够满足你的需求!如有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-30 20:23:10 | 显示全部楼层
FishC 发表于 2024-5-30 20:15
感谢你提供的信息!根据你的描述,如果你想使用数据库表中的`id`列作为x轴数据,`name`列作为y轴数据进 ...

C:\Users\Administrator\Pictures\4k\1.png,将这张照片中的各种数据用python以图标的格式写出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-30 20:23:28 | 显示全部楼层
豪在这学python 发表于 2024-05-30 20:23
C:\Users\Administrator\Pictures\4k\1.png,将这张照 ...


如果你想使用Python将一张照片中的各种数据以图表的形式呈现,你需要先将图片转换为RGB像素值的数据。然后,可以使用诸如Matplotlib等库将该数据可视化为不同类型的图表。

以下是一个示例代码,它使用Pillow库(用于对图像进行处理)和Matplotlib库(用于数据可视化)来实现这个目标:
from PIL import Image
import matplotlib.pyplot as plt

# 打开并加载图像
image_path = r'C:\Users\Administrator\Pictures\4k\1.png'
image = Image.open(image_path)

# 将图像转换为RGB模式
image_rgb = image.convert("RGB")

# 获取图像的像素值
pixels = image_rgb.getdata()

# 获取每个像素点的R、G、B值
red_values = []
green_values = []
blue_values = []
for pixel in pixels:
    red, green, blue = pixel
    red_values.append(red)
    green_values.append(green)
    blue_values.append(blue)

# 绘制柱状图
fig, ax = plt.subplots()
ax.bar(range(len(red_values)), red_values, color='red', alpha=0.5, label='Red')
ax.bar(range(len(green_values)), green_values, color='green', alpha=0.5, label='Green')
ax.bar(range(len(blue_values)), blue_values, color='blue', alpha=0.5, label='Blue')

# 设置x轴和y轴标签
ax.set_xlabel('Pixel Index')
ax.set_ylabel('RGB Value')
ax.set_title('Pixel RGB Values')

# 显示图例
ax.legend()

# 显示图表
plt.show()

请确保将 `image_path` 替换为你实际的图像路径。上述代码将打开指定的图像,并将其转换为RGB模式。然后,将每个像素的红、绿、蓝值提取出来,并使用Matplotlib绘制了柱状图,将红色值、绿色值和蓝色值分别显示在不同的柱子上。

希望这可以帮助你实现将图片中的数据以图表的形式展示出来!如有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 08:47:22 | 显示全部楼层
FishC 发表于 2024-5-30 20:23
如果你想使用Python将一张照片中的各种数据以图表的形式呈现,你需要先将图片转换为RGB像素值的数据。 ...

import re
import math
import pymysql  # 导入数据库
from bs4 import BeautifulSoup
from pyecharts.options import *
from pyecharts.faker import Faker
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Bar, Pie, Page, Geo, Timeline, Line3D, Scatter, Line


def bar():  # 柱状图
    year = Numberselect(Mysqlconnect("select year from countrygdp;"))
    country = Chineseselect(Mysqlconnect("select GDP from countrygdp;"))
    GDP = Numberselect(Mysqlconnect("select rate from countrygdp;"))
    data_dict = {}
    for i in range(len(year)):
        try:
            data_dict[year[i]].append([country[i], GDP[i]])
        except KeyError:
            data_dict[year[i]] = []
            data_dict[year[i]].append([country[i], GDP[i]])
    # 排序年份
    sorted_year_list = sorted(data_dict.keys())  # 排序年份
    timeline = Timeline({"theme": ThemeType.LIGHT})  # 创建时间线对象
    for year in sorted_year_list:
        data_dict[year].sort(key=lambda element: element[1], reverse=True)
        year_data = data_dict[year][:8]  # 取出本年份前八名的国家
        x_data = []
        y_data = []
        for country_gdp in year_data:
            x_data.append(country_gdp[0])  # x轴添加国家
            y_data.append(country_gdp[1] / 100000000)  # y轴添加GDP数据,单位为亿元
        bar = Bar()  # 构建柱状图
        x_data.reverse()
        y_data.reverse()
        bar.add_xaxis(x_data)
        bar.add_yaxis("GDP亿元", y_data, label_opts=LabelOpts(position="right"), color="#FFFFFF")
        bar.reversal_axis()  # 反转x轴,y轴
        bar.set_global_opts(
            title_opts=TitleOpts(title=f"{year}年全球GDP前八数据", title_textstyle_opts=opts.TextStyleOpts(
                color="#FFFFFF")),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')))  # 设置每一年的图表标题
        timeline.add(bar, str(year))  # 创建时间线对象
    c = timeline.add_schema(  # 设置时间为自动播放
        play_interval=1000,  # 时间间隔
        is_timeline_show=True,  # 是否显示时间
        is_loop_play=True,  # 是否循环
        is_auto_play=True  # 是否自动播放
    )
    return c


def tab(name, color, size):  # 标题
    c = (Pie().set_global_opts(title_opts=opts.TitleOpts(title=name, pos_left='center', pos_top='center',
                                                         title_textstyle_opts=opts.TextStyleOpts(color=color,
                                                                                                 font_size=size))))
    return c


def line():  # 折线图
    c = (
        Line()
        .add_xaxis(Faker.choose())
        .add_yaxis(
            'Lab A',
            Faker.values(),
            markline_opts=opts.MarkLineOpts(data=[
                {'yAxis': 150},
                opts.MarkLineItem(type_='min'),
                opts.MarkLineItem(type_='max'),
                opts.MarkLineItem(type_='average'),
            ])).add_yaxis(
            'Lab B',
            Faker.values(),
            markline_opts=opts.MarkLineOpts(data=[
                opts.MarkLineItem(type_='min'),
                opts.MarkLineItem(type_='max'),
                opts.MarkLineItem(type_='average'),
            ])).set_global_opts(
            title_opts=opts.TitleOpts(title='折线图中设置标记', title_textstyle_opts=opts.TextStyleOpts(
                color="#FFFFFF")),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            visualmap_opts=opts.VisualMapOpts(
                pos_top='10',
                pos_right='0',
                is_piecewise=True,
                pieces=[
                    {'gt': 0, 'lte': 50, 'color': '#096'},
                    {'gt': 50, 'lte': 100, 'color': '#ffde33'},
                    {'gt': 100, 'lte': 150, 'color': '#ff9933'},
                    {'gt': 150, 'lte': 200, 'color': '#cc0033'},
                    {'gt': 200, 'lte': 300, 'color': '#660099'},
                    {'gt': 300, 'color': '#7e0023'}
                ],
                out_of_range={'color': '#999'}
            ),
            datazoom_opts=[
                opts.DataZoomOpts(yaxis_index=0),
                opts.DataZoomOpts(type_='inside', yaxis_index=0),
            ]
        )
    )
    return c


def scatter():  # 散点图
    # 例1 自定义数据基本示例
    y1 = [[12, 4], [2, 5], [2, 6], [3, 15], [3, 6]]
    y2 = [[8, 2], [28, 4], [18, 6], [8, 61], [7, 2]]
    c = (
        Scatter()
        .add_xaxis(Faker.choose())
        .add_yaxis('数据1', y1)
        .add_yaxis('数据2', y2)
        .set_global_opts(
            title_opts=opts.TitleOpts(title='散点图', title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF')),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color='#FFFFFF'))
        )
    )

    return c


def Mysqlconnect(sql):  # 数据库连接
    conn = pymysql.connect(
        host='localhost',  # 连接名称,一般默认localhost
        user='root',  # 数据库用户名,一般都是root
        password='123456',  # 数据库密码,用户根据自定义设置
        port=3306,  # MySQL端口,系统默认的3306端口
        db='python',  # 连接数据库名
        charset='utf8'
    )  # 识别的字符编码
    cur = conn.cursor()  # 生成游标对象
    cur.execute(sql)
    sql1 = cur.fetchall()  # 通过fetchall获得数据
    cur.close()
    conn.close()
    return sql1


def Chineseselect(datas):  # 汉字数据筛选
    data = []
    for i in datas[:len(datas)]:
        data.append(re.search("[\u4e00-\u9fff]+", str(i)).group())
    return data


def Numberselect(datas):  # 数值数据筛选
    data = []
    for i in datas[:len(datas)]:
        data.append(int(re.search(r"[0-9]+", str(i)).group()))
    return data


def radius():  # 饼图
    cate = Chineseselect(Mysqlconnect("select area from vote_result"))
    data = Numberselect(Mysqlconnect("select vote from vote_result"))
    c = Pie()
    c.add('', [list(z) for z in zip(cate, data)], radius=["30%", "70%"], rosetype="radius")
    c.set_global_opts(title_opts=opts.TitleOpts(title="客户销售额占比", padding=[1, 350],
                                                title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
                      legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color="#FFFFFF"), type_="scroll",
                                                  orient="vertical", pos_right=0, pos_top="middle"))
    c.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
    c.set_colors(['red', "orange", "yellow", "green", "Cyan", "purple"])

    return c


def geo():  # 中国地图
    city_num = [('武汉', 200), ('成都', 70), ('北京', 99),
                ('西安', 80), ('杭州', 60), ('贵阳', 34),
                ('上海', 65), ('深圳', 54), ('乌鲁木齐', 76),
                ('哈尔滨', 47), ('兰州', 56), ('信阳', 85)]
    start_end = [('宁波', '成都'), ('武汉', '北京'), ('武汉', '西安'),
                 ('长沙', '杭州'), ('武汉', '贵阳'), ('武汉', '上海'),
                 ('甘肃', '深圳'), ('北京', '乌鲁木齐'), ('上海', '哈尔滨'),
                 ('武汉', '兰州'), ('西藏', '信阳')]
    c = Geo()
    c.add_schema(maptype='china', itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='white'))
    c.add('', data_pair=city_num, color='white')  # 4.添加数据
    c.add('', data_pair=start_end, type_="lines", label_opts=opts.LabelOpts(is_show=False),
          effect_opts=opts.EffectOpts(symbol="arrow", color='gold', symbol_size=7))
    c.set_global_opts(title_opts=opts.TitleOpts(title=""))

    return c


def scatter3D():  # 弹簧图
    data = []
    for t in range(0, 25000):
        _t = t / 1000
        x = (1 + 0.25 * math.cos(75 * _t)) * math.cos(_t)
        y = (1 + 0.25 * math.cos(75 * _t)) * math.sin(_t)
        z = _t + 2.0 * math.sin(75 * _t)
        data.append([x, y, z])
    c = (
        Line3D()
        .add("", data,
             xaxis3d_opts=opts.Axis3DOpts(Faker.clock, type_='value', axislabel_opts=opts.LabelOpts(color="white")),
             # 设置坐标轴白色
             yaxis3d_opts=opts.Axis3DOpts(Faker.week_en, type_="value", axislabel_opts=opts.LabelOpts(color="white")),
             grid3d_opts=opts.Grid3DOpts(
                 width=100, depth=100, rotate_speed=150, is_rotate=True, axislabel_opts=opts.LabelOpts(color="white")
             )
             )
        .set_global_opts(
            visualmap_opts=opts.VisualMapOpts(max_=30, min_=0, range_color=Faker.visual_color),
            title_opts=opts.TitleOpts(title="弹簧3D折线图", title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
        )
    )
    return c


def Summary():  # 汇总图
    page = Page()
    page.add(
        tab("班级:\t22数据本\n学号:\t2022402223\n姓名:\t郑尔豪", "#2CB34A", 20),
        bar(),
        tab("数据可视化大屏", "#2CB34A", 30),
        scatter3D(),
        radius(),
        line(),
        geo(),
        scatter()
    )
    return page


def Zhizuo():  # 修改布局
    with open("2021402156Mrtian.html", "r+", encoding='utf-8') as html:
        html_bf = BeautifulSoup(html, 'lxml')
        divs = html_bf.select('.chart-container')
        divs[0]["style"] = "width:10%;height:10%;position:absolute;top:0;left:2%;"
        divs[1]["style"] = "width:40%;height:40%;position:absolute;top:12%;left:0;"
        divs[2]["style"] = "width:35%;height:10%;position:absolute;top:2%;left:30%;"
        divs[3]["style"] = "width:30%;height:40%;position:absolute;top:10%;left:36%;"
        divs[4]["style"] = "width:40%;height:35%;position:absolute;top:12%;left:55%;"
        divs[5]["style"] = "width:30%;height:35%;position:absolute;top:55%;left:2%;"
        divs[6]["style"] = "width:60%;height:50%;position:absolute;top:45%;left:15%;"
        divs[7]["style"] = "width:35%;height:40%;position:absolute;top:55%;left:60%;"
        body = html_bf.find("body")
        body[
            "style"] = "background-image: url(https://tse1-mm.cn.bing.net/th/id/OIP-C.BLVs3j-wt2XVI2NdeI9FPAHaDt?w=342&h" \
                       "=175&c=7&r=0&o=5&pid=1.7);background-size:cover"  # 背景颜色
        html_new = str(html_bf)
        html.seek(0, 0)
        html.truncate()
        html.write(html_new)


if __name__ == '__main__':  # 主函数
    Summary().render('xxx.html')
    Zhizuo()
根据这些代码,完成一个讲解、解析ppt内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-26 10:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表