linying_0908 2024-07-18 15:17 采纳率: 0%
浏览 3

pyecharts柱状图

在使用pyecharts构建带有时间线的柱状图的时候,发现最终图表的右侧,有所有Y轴(未反转前是x轴)的标签信息堆叠。这种情况怎么解决?是在timeline模块里设置,还是bar里设置参数取消右侧标签显示呢?
附上代码~

"""
动态柱状图,显示从1960年开始前8个国家的GDP
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
# 读取文件数据,这个文件数据比较特别,是ANSI编码的。
f_p = open('C:/python/visual/1960-2019全球GDP数据.csv', 'r', encoding='ANSI')
data = f_p.readlines()      # 按行读取数据
f_p.close()

# 删除第一行数据
data.pop(0)

# 构建柱状图所需要数据
# {年份:[[国家,GDP],[国家,GDP],[国家,GDP],...],...年份:[[国家,GDP],[国家,GDP],[国家,GDP]]}

data_dict = {}
for line in data:
    year = int(line.split(',')[0])      # 年份
    country = line.split(',')[1]        # 国家
    gdp = float(line.split(',')[2])     # gdp
    # 如何判断字典里是否有指定key值,用来解决年份不存在,从1960到1961这个情况
    # 已经有年份,只要继续追加
    # 没有的年份,需要新建,若没有新建,会出现KeyError错误
    try:
        data_dict[year].append([country, gdp])
    except KeyError:
        data_dict[year] = []
        data_dict[year].append([country, gdp])

# 创建时间线,并设置主题
timeline = Timeline(
    {"theme": ThemeType.LIGHT}
)
# 将字典中的年份按顺序排列,keys()获取字典key值方法
sorted_year_list = sorted(data_dict.keys())
for year in sorted_year_list:
    # 利用sort排序
    data_dict[year].sort(key=lambda element: element[1], reverse=True)
    # 取出本年份前8名的国家
    year_data = data_dict[year][0: 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 = x_data[::-1]
    x_data.reverse()
    bar.add_xaxis(x_data)
    # y_data = y_data[::-1]
    y_data.reverse()
    bar.add_yaxis("GDP(亿)", y_data,
                  label_opts=LabelOpts(position="right"))
    bar.set_global_opts(
        xaxis_opts=AxisOpts(splitline_opts=SplitLineOpts(is_show=False)),
        yaxis_opts=AxisOpts(splitline_opts=SplitLineOpts(is_show=False)),
        title_opts=TitleOpts(
            title=f"{year}年全球GDP前8国家"
        )

    )
    bar.reversal_axis()

    timeline.add(bar, str(year))
# 时间线自动播放
timeline.add_schema(
    play_interval=1000,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=False
)

timeline.render("1960-2019年GDP前8国家.html")

运行结果截图:

img

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-07-18 15:23
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    解决图表右侧标签堆叠问题

    在pyecharts中,图表的标签堆叠问题通常是由于标签的显示位置和图表的布局设置不当引起的。你可以通过以下几种方式来解决这个问题:

    1. 调整标签位置:在LabelOpts中设置position参数,确保标签不会堆叠。
    2. 设置标签间隔:在LabelOpts中设置interval参数,控制标签的显示间隔。
    3. 调整图表的布局:通过设置grid参数,调整图表的布局,确保标签有足够的空间显示。

    在你的代码中,你已经使用了LabelOpts(position="right")来设置标签的位置。你可以尝试以下代码来进一步调整:

    bar.add_yaxis("GDP(亿)", y_data,
                  label_opts=LabelOpts(position="right", interval="auto"))
    

    数据读取和处理

    你的代码中已经包含了从CSV文件中读取数据并处理这些数据的逻辑。确保你的CSV文件路径和编码格式正确,数据读取和处理应该没有问题。

    柱状图的构建和排序

    你的代码中已经包含了构建柱状图和对数据进行排序的逻辑。确保数据按年份和GDP值正确排序,然后提取每个年份的前8个国家的数据。

    时间线和图表的整合

    你的代码中已经包含了将柱状图与时间线整合的逻辑。确保时间线的参数设置正确,如自动播放、播放间隔等。

    图表的渲染和导出

    你的代码中已经包含了将图表渲染并导出为HTML文件的逻辑。确保文件路径正确,图表应该可以正确导出。

    完整代码示例

    以下是根据你的描述和代码示例,调整后的完整代码:

    """
    动态柱状图,显示从1960年开始前8个国家的GDP
    """
    from pyecharts.charts import Bar, Timeline
    from pyecharts.options import *
    from pyecharts.globals import ThemeType
    
    # 读取文件数据,这个文件数据比较特别,是ANSI编码的。
    f_p = open('C:/python/visual/1960-2019全球GDP数据.csv', 'r', encoding='ANSI')
    data = f_p.readlines()      # 按行读取数据
    f_p.close()
    
    # 删除第一行数据
    data.pop(0)
    
    # 构建柱状图所需要数据
    # {年份:[[国家,GDP],[国家,GDP],[国家,GDP],...],...年份:[[国家,GDP],[国家,GDP],[国家,GDP]]}
    
    data_dict = {}
    for line in data:
        year = int(line.split(',')[0])      # 年份
        country = line.split(',')[1]        # 国家
        gdp = float(line.split(',')[2])     # gdp
        # 如何判断字典里是否有指定key值,用来解决年份不存在,从1960到1961这个情况
        # 已经有年份,只要继续追加
        # 没有的年份,需要新建,若没有新建,会出现KeyError错误
        try:
            data_dict[year].append([country, gdp])
        except KeyError:
            data_dict[year] = []
            data_dict[year].append([country, gdp])
    
    # 创建时间线,并设置主题
    timeline = Timeline(
        {"theme": ThemeType.LIGHT}
    )
    # 将字典中的年份按顺序排列,keys()获取字典key值方法
    sorted_year_list = sorted(data_dict.keys())
    for year in sorted_year_list:
        # 利用sort排序
        data_dict[year].sort(key=lambda element: element[1], reverse=True)
        # 取出本年份前8名的国家
        year_data = data_dict[year][0: 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()
        bar.add_xaxis(x_data)
        y_data.reverse()
        bar.add_yaxis("GDP(亿)", y_data,
                      label_opts=LabelOpts(position="right", interval="auto"))
        bar.set_global_opts(
            xaxis_opts=AxisOpts(splitline_opts=SplitLineOpts(is_show=False)),
            yaxis_opts=AxisOpts(splitline_opts=SplitLineOpts(is_show=False)),
            title_opts=TitleOpts(
                title=f"{year}年全球GDP前8国家"
            )
        )
        bar.reversal_axis()
    
        timeline.add(bar, str(year))
    
    # 时间线自动播放
    timeline.add_schema(
        play_interval=1000,
        is_timeline_show=True,
        is_auto_play=True,
        is_loop_play=False
    )
    
    timeline.render("1960-2019年GDP前8国家.html")
    

    这段代码应该能够解决你提到的问题,并生成一个动态的柱状图,显示从1960年开始前8个国家的GDP。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月18日