目的:
以csv表格中的数据为z轴,对应格子的行数为x,列数为y,绘出颜色根据数据值大小而改变的折线图。
import pandas as pd
from pyecharts.charts import Line3D
from pyecharts.charts import Bar3D
from pyecharts import options as opts
from pyecharts.faker import Faker
from pyecharts.options import AxisOpts, ToolBoxFeatureOpts
# 读取csv数据
df = pd.read_csv('文件.csv')
# 获取x、y坐标
x_data = list(range(len(df.index)))
y_data = list(range(len(df.columns)))
print("x_data长度:", len(x_data))
print("y_data长度:", len(y_data))
# 构造三维数据
data = []
for i in range(len(df.index)):
for j in range(len(df.columns)):
data.append([i, j, df.iloc[i, j]*1000000-333333]) #填充数值,去掉重复位置的数值,使得数据更具有变化
# 绘制3d折线图
print("data的类型",type(data))
#根据列分组,便于绘图
data0 = [row for row in data if row[1] == 0]
data1 = [row for row in data if row[1] == 1]
data2 = [row for row in data if row[1] == 2]
total_third_column = [row[2] for row in data]
opts.MarkLineOpts(precision=10)
def find_min_max(data):
print("data的类型", type(data))
# 获取第三列的值
third_column = [row[2] for row in data]
# 查找第三列的最大值和最小值
max_value = max(third_column)
min_value = min(third_column)
# 打印最大最小值
print("data最大值:", max_value)
print("data最小值:", min_value)
return max_value,min_value
max0,min0 = find_min_max(data0)
max1,min1 = find_min_max(data1)
max2,min2 = find_min_max(data2)
# 预设全局变量
ztype = "value"
xname = "Iteration Step"
yname = "Hidden Units"
totalFont = 'Time New Roman'
#开始绘图
c = (
# 全局配置的初始化设置应在声明折线时设置,否则会出现默认配置
# 官网手册中给出的是调用options.InitOpts(), 但实际上应该是在Line3D()中设置,不知道为什么
# 附官网链接:https://pyecharts.org/#/zh-cn/global_options
Line3D(init_opts=opts.InitOpts(width="100%", height="800px"))# 设置画图的宽高
.add(
"",
data0,
xaxis3d_opts=opts.Axis3DOpts(data=x_data, type_="value",name=xname,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
yaxis3d_opts=opts.Axis3DOpts(data=y_data, type_="value",name=yname,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
zaxis3d_opts=opts.Axis3DOpts(data=total_third_column,type_=ztype,min_=0.25000000,max_=0.4000000,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
grid3d_opts=opts.Grid3DOpts(
width=150, depth=100
),
)
.add(
"",
data1,
xaxis3d_opts=opts.Axis3DOpts(data=x_data, type_="value",name=xname,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
yaxis3d_opts=opts.Axis3DOpts(data=y_data, type_="value",name=yname,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
zaxis3d_opts=opts.Axis3DOpts(data=total_third_column,type_=ztype,min_=0.25000000,max_=0.4000000,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
grid3d_opts=opts.Grid3DOpts(
width=150, depth=100
),
)
.add(
"",
data2,
xaxis3d_opts=opts.Axis3DOpts(data=x_data, type_="value",name=xname,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
yaxis3d_opts=opts.Axis3DOpts(data=y_data, type_="value",name=yname,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
zaxis3d_opts=opts.Axis3DOpts(data=total_third_column,type_=ztype,min_=0.25000000,max_=0.4000000,textstyle_opts=opts.LabelOpts(font_family=totalFont)),
grid3d_opts=opts.Grid3DOpts(
width=150, depth=100,height=100
),
)
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(
max_=0.38000000,
min_=0.27000000,
range_color=Faker.visual_color,
precision = 10,
),
datazoom_opts=opts.DataZoomOpts(
is_show=True,
),
title_opts=opts.TitleOpts(title="Line3D"),
axispointer_opts=opts.Axis3DOpts(
min_=0.2000000,
max_=0.4000000
),
toolbox_opts=opts.ToolboxOpts(
is_show=True,
orient="vertical",
pos_left="right",
pos_top="center",
feature=ToolBoxFeatureOpts(save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(background_color="#fff",pixel_ratio=1.5)),
),
xaxis_opts=opts.AxisOpts(name_textstyle_opts=opts.TextStyleOpts(font_family=totalFont)),
yaxis_opts=opts.AxisOpts(name_textstyle_opts=opts.TextStyleOpts(font_family=totalFont))
)
.set_series_opts(
markline_opts=opts.MarkLineOpts(
precision=10
),
)
.render("line3d_autorotate.html")
)
效果图