前言
在b站学习python时,做动态GDP柱状图绘制时,弹幕有人问如何将中国的柱状颜色设置的与其他颜色不同,根据视频中的代码没有办法动态设置中国颜色,搜索了一些文章后,在作者:jayvee_ 文章: pyecharts如何给柱形图的每个柱子设置不同颜色的方法基础上修改成功实现。
方法
利用pyecharts的JSCode工具,运行js代码来实现。思路如下:
对象结构
name值是我们需要的"中国",value值是GDP数据,可能存在相同的情况,所以采用name判断。利用pyecharts的JsCode运行以下代码
function (params) {
if (params.name==('中国')) {
//红色
return '#FF0000';
}else return '#37A2DA'; //蓝色
具体代码如下:
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *
from pyecharts.globals import *
from pyecharts.commons.utils import JsCode
# 读取数据
f = open("E:\PC_SRC\Desktop\python-study\可视化案例数据\动态柱状图数据\\1960-2019全球GDP数据.csv","r",encoding="UTF-8")
data = f.readlines()
f.close()
data.pop(0)
data_dic = {}
for i_data in data:
li_data = i_data.split(",")
y = int(li_data[0])
c = li_data[1]
f = float(li_data[2])
cf_dic = [c,f]
if(not y in data_dic):
data_dic[y] = [cf_dic]
else:
data_dic[y].append(cf_dic)
# 创建时间线对象
timeline = Timeline({"theme": ThemeType.LIGHT})
# 排序年份
yearlist = sorted(data_dic.keys())
for year in yearlist:
year_data = dict(sorted(data_dic[year] , key=lambda e: e[1],reverse=True))
# 取前8名国家数据
x_data = list(year_data.keys())[0:8]
y_data = list(map(lambda x:round(x/100000000,2),list(year_data.values())))[0:8]
# 逆转一下
x_data.reverse()
y_data.reverse()
# 构建柱状图
bar = Bar()
bar.add_xaxis(x_data)
# 此处为修改颜色的js代码,判断params的名字是否为中国
color_function = "function (params) {if (params.name==('中国')) {return '#FF0000';}else return '#37A2DA'}"
bar.add_yaxis("GDP(亿)",y_data,label_opts=LabelOpts(position="right"),itemstyle_opts=ItemStyleOpts(color=JsCode(color_function)))
bar.reversal_axis()
bar.set_global_opts(
title_opts=TitleOpts(title=f"{year}全球前8GDP数据")
)
timeline.add(bar, str(year))
# 时间线自动播放
timeline.add_schema(
play_interval=1000,
is_auto_play=True,
is_loop_play=False,
is_timeline_show=True
)
# 绘图
timeline.render("1960-2019全球GDP前8国家.html")
绘制效果
避坑
如果js代码中不加else,其它柱子就会变透明,如果else返回的颜色错误,就会出现其他国家也会变红的bug,如图
总结
还在学习中,我觉得这种方法可能比较麻烦,应该有更方便的方法来实现,希望会的大佬在评论区补充一下。