Python绘图与数据可视化

💪一些常画图 常用库 强大的工具!比如matplotlib, seaborn, pyechart等!

3D柱形图

  • 方法签名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
add(name, x_axis, y_axis, data,
grid3d_opacity=1,
grid3d_shading='color', **kwargs)

name -> str
图例名称
x_axis -> str
x 坐标轴数据。需为类目轴,也就是不能是数值。
y_axis -> str
y 坐标轴数据。需为类目轴,也就是不能是数值。
data -> [list], 包含列表的列表
数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』
grid3d_opacity -> int
3D 笛卡尔坐标系组的透明度(柱状的透明度),默认为 1,完全不透明。
grid3d_shading -> str
三维柱状图中三维图形的着色效果。
color:只显示颜色,不受光照等其它因素的影响。
lambert:通过经典的 lambert 着色表现光照带来的明暗。
realistic:真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让展示的画面效果和质感有质的提升。ECharts GL 中使用了基于物理的渲染(PBR) 来表现真实感材质。

官方文档

下面是用美赛d的数据集写的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import pandas as pd
from pyecharts import Bar3D

csv_file_path = 'data.csv'
df = pd.read_csv(csv_file_path, header=None)

years = df.iloc[1:12, 1].tolist()
months = list(df.iloc[0, 2:])
data = []
max_flow = 8580
min_flow = 6456

for year in years:
for i, month in enumerate(months):
# 后面画其他流域的流量就只用改变years.index(year) + 12后面的数字 这里表示行数 每次加11就好
value = float(df.iloc[years.index(year) + 111, months.index(month) + 2])
print(value)
if value > max_flow:
max_flow = value
if value < min_flow:
min_flow = value
data.append([year, month, value])

bar3d = Bar3D("St. Lawrence River - Flow at Cornwall", width=800, height=600)
x_axis = years
y_axis = months
range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf',
'#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']

bar3d.add("",
x_axis,
y_axis,
data,
is_visualmap=True,
visual_range=[min_flow, max_flow],
line_opacity=1,
#亲身体验下面这条很有用!可以更立体更明晰!
grid3d_shading="lambert",
# 控制左下角颜色范围
visual_range_color=['#e0f3f8', '#2260b3']
)

bar3d.render()

效果如下:

主题河流图

官网示例

正好我们国赛选的是河流相关问题,现学了一下,调试很久,居然成功了

有几个需要注意的点:

  • y_data第一个每一个记录的第一个值必须是标准日期形式,我们最开始只有月份,需要转换一下
  • pyechart感觉还没有很好推广,需要注意python版本问题和导包方式,这就自己google一下慢慢调吧
  • 还没有找到更换颜色的方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from pyecharts import options as opts
from pyecharts.charts import ThemeRiver
import pandas as pd
from datetime import datetime

def month_to_date(month_str):
month_mapping = {
'Jan': 1,
'Feb': 2,
'Mar': 3,
'Apr': 4,
'May': 5,
'Jun': 6,
'Jul': 7,
'Aug': 8,
'Sep': 9,
'Oct': 10,
'Nov': 11,
'Dec': 12
}
month_num = month_mapping.get(month_str)
date_obj = datetime(year=2022, month=month_num, day=1)
formatted_date = date_obj.strftime('%Y/%m/%d')
return formatted_date

x_data = ['St. Marys River', 'St. Clair River', 'Detroit River', 'Niagara River', 'St. Lawrence River']
y_data = []

df = pd.read_excel('flow.xlsx')

for river in x_data:
river_data = df.melt(id_vars='Month', value_vars=river, var_name='River', value_name='Flow')
print(river_data)
print('end')
for index, row in river_data.iterrows():
y_data.append([month_to_date(row['Month']), row['Flow']])

(
ThemeRiver()
.add(
series_name=x_data,
data=y_data,
singleaxis_opts=opts.SingleAxisOpts(
pos_top="50", pos_bottom="50", type_="time"
)
)
.set_global_opts(
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line")
)
.render("theme_river_colored.html")
)

画好效果如下,还是很贴切滴,满意嘿嘿