写在前面
最近在完成期末论文,要求自己画图,用https://hiplot.cn/画的图感觉总是差点意思,刚好当时在帮一个师姐一个python小脚本debug,突然想起之间师兄讲过的pyechart包,遂开始磕磕绊绊的学习。
下载
我是直接在VS code中使用jupyter插件的,直接在终端中输入
pip install ptecharts
如果使用网页链接jupyter的话也可以直接在cmd中安装,代码同上
pyecharts
注:以下只是我自己学习的分享,想要知道更多关于pyecharts可以在网上公开的文档中搜索
线图(目前只学到了这)
数据处理
示例数据
将数据转换格式读入变量中
# 插入pandas、numpy数组与pyecharts包
import pandas as pd
import numpy as np
# 读取数据
with open("./draw.txt","r") as f:
data = f.readlines()
dataline = {}
i = 0
# 提取x轴与系列名称
x_name=""
series_name=[]
draw_xaxis = []
for line in data:
field = line.strip().split("\t")
if(i == 0):
x_name = field[0]
series_name=(field[1:8])
else:
draw_xaxis.append(field[0])
i = i+1
print (x_name)
# 提取每个系列的数据
## ==将表格转换为DataFrame格式 ==,非常重要
dataframe = pd.read_excel(io='./draw.xlsx')
# 将列表转换为元组(列表不为哈希对象,不可做为字典的键)
#这里我是准备了两个相同的文件,一个txt格式,一个xlsx文件,肯定有更好的方法,但我精力有限,懒得回去写了
data = {}
for i in range(len(series_name)):
a = series_name[i]
data[a] = dataframe[a]
如此我们就得到了x轴的标签以及各个系列的数据,这部分不是重点,不再赘述,热身结束
绘图
- 导入pyechart的line类与options模块,如果有需要还可以导入主题类
from pyecharts.charts import Line # 导入 Line 类
from pyecharts import options as opts # 导入 options 模块并给其取一个别名 opts
from pyecharts.globals import ThemeType # 导入 ThemeType 类型
- 创建实例
值得提到的是,pyecharts的配置项分为全局配置项与局部配置项,关于坐标轴的(网格、刻度、值)或者全图的设置都应该在全局配置项中设置好,系列的作图则应该在局部变量中配置好,比如
line = (
Line()
# 全局配置项
.set_global_opts(
# 设置标题属性
title_opts=opts.TitleOpts(
title="苦瓜发芽率",
),
# 设置 x 轴属性
xaxis_opts=opts.AxisOpts(
name="天数",
),
# 设置 y 轴属性
yaxis_opts=opts.AxisOpts(
name="发芽率",
),
)
# 局部配置项,添加 x、y 轴数据
.add_xaxis(draw_xaxis)
.add_yaxis('CK',data['CK'])
.add_yaxis('T5',data['T5'])
.add_yaxis('T10',data['T10'])
.add_yaxis('T15',data['T15'])
.add_yaxis('T30',data['T30'])
.add_yaxis('T45',data['T45'])
.add_yaxis('T60',data['T60'])
)
line.render_notebook()
跑出来试一下
嗯,果然是异常的乱七八糟,可以看到至少有两个问题要解决,第一个是这么长的数字肯定是不能出现在图片上的,第二个是网格也不适合出现在我们的图表中。
对此可以用一些自带的方法解决
# 在add_yaxis方法中label_opts可以指定系列标签的属性,使用is_show=False选项可以取消标签显示
# 网格的取消比较复杂,我们要先隐藏所有刻度线,xaxis_opts中splitline_opts可以指定刻度线的属性,
# 使用is_show=False选项可以取消显示
line = (
Line()
# 全局设置
.set_global_opts(
# 设置标题属性
title_opts=opts.TitleOpts(
title="苦瓜发芽率",
),
# 设置 x 轴属性
xaxis_opts=opts.AxisOpts(
name="天数",
splitline_opts=opts.SplitLineOpts(is_show=False), # 取消刻度线
),
# 设置 y 轴属性
yaxis_opts=opts.AxisOpts(
name="发芽率",
splitline_opts=opts.SplitLineOpts(is_show=False),
),
)
# 添加 x、y 轴数据
.add_xaxis(draw_xaxis)
.add_yaxis('CK',data['CK'],label_opts=opts.LabelOpts(is_show=False)) # 取消标签展示
.add_yaxis('T5',data['T5'],label_opts=opts.LabelOpts(is_show=False))
.add_yaxis('T10',data['T10'],label_opts=opts.LabelOpts(is_show=False))
.add_yaxis('T15',data['T15'],label_opts=opts.LabelOpts(is_show=False))
.add_yaxis('T30',data['T30'],label_opts=opts.LabelOpts(is_show=False))
.add_yaxis('T45',data['T45'],label_opts=opts.LabelOpts(is_show=False))
.add_yaxis('T60',data['T60'],label_opts=opts.LabelOpts(is_show=False))
)
line.render_notebook()
看一下结果
嗯?y轴呢?因为之前的y轴是由刻度线组成的,刻度线被我们删除,自然就没有了,此时我们要打开y轴,就可以了
yaxis_opts=opts.AxisOpts(
name="发芽率",
splitline_opts=opts.SplitLineOpts(is_show=False),
axisline_opts=opts.AxisLineOpts(
is_show=True # 显示y轴
)
),
- 缝缝补补
看来图已经基本满足我们的要求,但是还不够好,我们随便看一篇论文的折线图,可以发现有以下几个特点- 白底黑字
- 喜欢用不同的图形当图例
- 标题更清楚
Salicylic acid treatment delayed the browning development in the pericarp of fresh longan by regulating the metabolisms of ROS and membrane lipid(不知道怎么删水印,放出原文链接,如有侵权请联系我)
如何画的像一点呢
那么就需要扩展我们使用的函数了,更多函数可以参考pyecharts文档。
这里主要是以下几种
标题字号字体
# title_opts中
title_textstyle_opts=opts.TextStyleOpts(
color='black', # 标题颜色,可以用英文指定,也可以用字符串
font_weight='bold', # 标题加粗,’bold‘加粗
font_size='20' # 标题字号
)
# xaxic_opts、yaxic_opts 中
name_textstyle_opts=opts.TextStyleOpts(
color='black',
font_weight='bold',
font_size='15',
font_family='Microsoft YaHei' # 字体
),
# 系列变量中
symbol='arrow', # 图例类型,自带类型 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none' 8种
symbol_size=8, # 图例大小
color='black'
背景
这里我们可以采用初始化变量
line = (
Line(
init_opts=opts.InitOpts(height="600px", # 图宽
bg_color="white") # 背景颜色
)
.set_global_opts(...)
坐标轴颜色
与显示y轴的函数一致
axisline_opts=opts.AxisLineOpts(
is_show=True,
linestyle_opts=opts.LineStyleOpts(color='black')
)
这样,我们完成了坐标轴颜色与标题的优化,采用了不同的图例表示不同系列,将他们整合到一段代码中
from pyecharts.charts import Line # 导入 Line 类
from pyecharts import options as opts # 导入 options 模块并给其取一个别名 opts
from pyecharts.globals import ThemeType # 导入 ThemeType 类型
model_data=[0,0.20,0.40,0.60,0.80,1.00] # 设置数据
# 创建实例并设置初始属性
line = (
Line(
init_opts=opts.InitOpts(height="600px",bg_color="white")
)
# 全局设置
.set_global_opts(
# 设置标题属性
title_opts=opts.TitleOpts(
title="苦瓜发芽率",
pos_left="45%", # 标题左对齐的位置
title_textstyle_opts=opts.TextStyleOpts(
color='black', # 标题颜色
font_weight='bold', # 标题加粗
font_size='20' # 标题字号
)
),
# 设置 x 轴属性
xaxis_opts=opts.AxisOpts(
name="天数",
is_show=True,
boundary_gap=0,
name_gap=30,
splitline_opts=opts.SplitLineOpts(is_show=False),
name_location='center',
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color='black')
),
name_textstyle_opts=opts.TextStyleOpts(
color='black',
font_weight='bold',
font_size='15',
font_family='Microsoft YaHei'
),
),
# 设置 y 轴属性
yaxis_opts=opts.AxisOpts(
name="发芽率",
is_show=True,
type_="value",
is_scale=True,
boundary_gap=0,
name_location='center',
name_gap=30,
name_textstyle_opts=opts.TextStyleOpts(
color='black',
font_weight='bold',
font_size='15',
font_family='Microsoft YaHei'
),
splitline_opts=opts.SplitLineOpts(is_show=False),
axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
axisline_opts=opts.AxisLineOpts(
is_show=True,
linestyle_opts=opts.LineStyleOpts(color='black')
)
),
# 设置图例属性
legend_opts=opts.LegendOpts(
orient='vertical',
pos_right=20,
pos_top='40%'
),
)
# 添加 x、y 轴数据
.add_xaxis(draw_xaxis)
.add_yaxis('CK',
data['CK'],
label_opts=opts.LabelOpts(is_show=False),
symbol='triangle',
symbol_size=8,
color='black')
.add_yaxis('T5',
data['T5'],
label_opts=opts.LabelOpts(is_show=False),
symbol='rect',
symbol_size=10,
color='black')
.add_yaxis('T10',
data['T10'],
label_opts=opts.LabelOpts(is_show=False),
symbol='diamond',
symbol_size=10,
color='black')
.add_yaxis('T15',
data['T15'],
label_opts=opts.LabelOpts(is_show=False),
symbol='circle',
symbol_size=8,
color='black')
.add_yaxis('T30',
data['T30'],
label_opts=opts.LabelOpts(is_show=False),
symbol='roundRect',
color='black',
symbol_size=8)
.add_yaxis('T45',
data['T45'],
label_opts=opts.LabelOpts(is_show=False),
symbol='arrow',
symbol_size=8,
color='black')
.add_yaxis('T60',
data['T60'],
label_opts=opts.LabelOpts(is_show=False),
symbol_size=8,
color='black')
)
# 渲染图表
line.render_notebook()
# 保存到指定文件
line.render("page1.html")
肯定有更短的代码可以实现,但是我还没研究出来…
回车!
有模有样地!
编者按
本篇文章只是作为我学习记录的分享,本人不是计科专业的人,只是喜欢玩一下未知的东西。已经尽量勘误(不懂得太多了),如果还是有错,请多多见谅,希望没有耽误你。不过现在gpt这么厉害,看这些的人会越来越少吧,多谢阅读!