plotly 导出的html显示中文乱码,怎么解决?

plotly 导出的html显示中文乱码,怎么解决?

import pandas as pd
import plotly as py
import plotly.graph_objs as go

profit_rate = [-0.001, -0.013, -0.004, 0.002, 0.003, -0.001, -0.009, 0.0, 0.007,\
    -0.005, 0.0, 0.001, -0.006, -0.006, -0.009, -0.013, 0.005, 0.007,\
    0.004, -0.006, -0.009, -0.004, 0.015, 0.007, 0.001, 0.003, -0.009,\
    -0.005, 0.001, -0.008, -0.016, 0.002, -0.013, -0.009, -0.014, 0.009,\
    -0.003, 0.002, -0.001, 0.011, 0.004]
date = pd.bdate_range(start = '3/1/2017', end = '4/30/2017')
trace = [go.Scatter(
    x = date,
    y = profit_rate
)]
layout = dict(
    title = '浦发银行20170301-20170428涨跌幅变化',
    xaxis = dict(title = 'Date'),
    yaxis = dict(title = 'profit_rate'),
    font_family="SimHei"
)

fig = dict(data = trace, layout = layout)
html = py.offline.plot(fig, filename='浦发银行20170301-20170428涨跌幅变化.html',auto_open=False)

img

主要是由于win11系统使用的默认字符集是GBK,需要修改默认字符集,修改方法如下:

按键盘win键(或点击底部栏的"开始"按钮),搜索“地区”

打开语言和区域

img

点击管理语言设置
显示

img


区域,选择管理页签,点击更改系统区域设置
显示

img

在“Beta版:使用Unicode UTF-8提供全球语言支持”前面打钩,点击确定后重启

重启后,plotly生成的html能够正常显示中文

Python 的 Plotly 库生成的 HTML 中出现中文乱码的问题,通常情况下可以通过设置字体来解决。以下是一些可能的解决方法:

  1. 设置字体:在 Plotly 中设置中文字体,如 "SimHei"、"Microsoft YaHei" 等,例如:

    import plotly.graph_objects as go
    
    # 创建折线图
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6], name="折线"))
    
    # 设置中文字体
    fig.update_layout(
        font_family="SimHei",
    )
    
    # 导出 HTML 文件
    fig.write_html("figure.html")
    

    在上面的代码中,通过调用 update_layout() 方法来设置字体为华文黑体,值为"SimHei"。这样可以确保生成的 HTML 中文标题显示正常。

  2. 安装中文字体库:为操作系统安装中文字体库,以确保支持中文显示,例如安装 "SimHei"、"Microsoft YaHei" 等字体库。

  3. 将图表导出为图片格式,再将图片插入 HTML 中:将图表导出为 PNG、JPEG、SVG 等格式,然后将图片插入到 HTML 文件中。这样可以确保图表标题、轴标签等文字显示正常。例如,

    fig.write_image("figure.png")
    

    然后将图片嵌入 HTML 中:

    <div>
        <img src="./figure.png" alt="" width="1000px">
    </div>
    

    需要注意的是,这种方法可能会降低图表的精度和交互性。

如果以上方法都尝试过了仍然不能解决问题,那么建议使用其他支持中文显示的数据可视化库,例如 Pyecharts 或 Matplotlib。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7540882
  • 除此之外, 这篇博客: Plotly深入浅出中的 3,散点图 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    散点图适合表现大量样本的多个属性的分布规律。散点图的每个点表示一个样本,每个坐标维度表示一个属性。

    当样本属性维度多于2个时,可以使用点的颜色或大小等方式来表达更多属性维度。

    import pandas as pd 
    import plotly.graph_objs as go
    
    dfboy = pd.DataFrame()
    dfboy['weight'] = [56,67,65,70,57,60,80,85,76,64]
    dfboy['height'] = [162,170,168,172,168,172,180,176,178,170]
    dfboy["BMI"] =  dfboy["weight"]/(dfboy["height"]**2)
    
    dfgirl = pd.DataFrame()
    dfgirl['weight'] = [50,62,60,70,57,45,62,65,70,56]
    dfgirl['height'] = [155,162,165,170,166,158,160,170,172,165]
    dfgirl["gender"] = "female"
    dfgirl["BMI"] = dfgirl["weight"]/(dfgirl["height"]**2)
    
    
    trace1 = go.Scatter(x=dfboy["weight"],y=dfboy["height"],mode="markers",name="male",
                         marker = dict(color="blue",size=3e5*dfboy["BMI"],sizemode='area'))
    
    trace2 = go.Scatter(x=dfgirl["weight"],y=dfgirl["height"],mode="markers",name="female",
                       marker = dict(color="red",size=3e5*dfgirl["BMI"],
                                     sizemode='area'))
    
    layout = go.Layout({"title":"height & weight",
                        "xaxis.title":"weight",
                        "yaxis.title":"height",
                        "legend.title":"gender",
                        "font.size":15})
    
    fig = go.Figure(data=[trace1,trace2],layout=layout)
    fig.show()

    6294e60dcf809a53c15c14a6a6bdd998.png

    热力图可以直观地展示一个二维矩阵的取值,它将一个矩阵的每个元素取值对应到热力图上的一个像素颜色取值。

    import numpy as np 
    import plotly.graph_objs as go
    
    arr = np.random.normal(loc = 0,scale = 1,size = [10,10])
    trace = go.Heatmap(x=np.arange(10),y=np.arange(10),z=arr,
                       colorscale='Viridis',showscale=True,reversescale = False)
    layout = go.Layout(width=600, height=600)
    fig = go.Figure(data=trace,layout=layout) 
    fig.show()
  • 以下回答来自chatgpt:

    答案:

    可以尝试以下方法解决plotly导出的html中文乱码问题:

    1.在代码中添加以下代码来设置字体:

    import plotly.io as pio pio.templates.default = "ggplot2" pio.renderers.default = "browser"

    设置中文字体

    pio.templates[pio.templates.default].layout.font.family = 'Microsoft YaHei'

    2.将文本框中文进行转码:

    import plotly.graph_objects as go import pandas as pd

    读取数据库

    data = pd.read_csv("tips.csv")

    将中文转为unicode编码

    data['day'] = data['day'].apply(lambda x: x.encode('unicode_escape').decode('utf-8')) data['sex'] = data['sex'].apply(lambda x: x.encode('unicode_escape').decode('utf-8'))

    fig = go.Figure()

    添加散点图

    fig.add_trace(go.Scatter( x=data['sex'], y=data['tip'], mode='markers', ))

    设置布局

    fig.update_layout( title="每周小费", xaxis_title="日期", yaxis_title="小费", )

    显示图表

    fig.show()

    3.使用HTML的meta标签设置中文字体:

    在生成的HTML文件中添加以下代码:


以上是部分解决方案,具体还要根据实际情况进行调试。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^