pyecharts中箱线图,代码基本可以直接运行
在制作箱线图可能会遇到的组合,所需用到的代码均做了注释,用的V1版本。非常的小白,非常的友好!!
超级详细的注释,还有动图呢!!
箱线图:c.add_yaxis("名字", c.prepare_data(v1))
输入数据:用列表形式
from pyecharts import options as opts
from pyecharts.charts import Boxplot
v1 = [
[850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980],
[960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790],
]
v2 = [
[289, 281, 210, 282,280, 370, 270, 374, 270, 376, 290, 392],
[80, 40, 80, 80, 60, 10, 70, 10, 80, 80, 80, 80],
]
c = Boxplot(init_opts=opts.InitOpts(width="800px", height="500px")) #设置大小
c.add_xaxis(["expr1", "expr2"])
c.add_yaxis("A组", c.prepare_data(v1)) #这个和之前不一样
c.add_yaxis("B组", c.prepare_data(v2))
c.set_global_opts(title_opts=opts.TitleOpts(title="BoxPlot-基本示例"))
c.render("boxplot_base.html")
这个思路是,做两个图,然后重叠两个图使得看似重合~
分割线是否显示:splitline_opts=opts.SplitLineOpts(is_show=False)
按照名称/min/Q1/mid/Q3/max展示:
.set_series_opts(tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}"))
import pyecharts.options as opts
from pyecharts.charts import Grid, Boxplot, Scatter
y_data = [
[980,930,650,760,810,1000,1000,960,960,],
[920,930,650,760,310,1000,100,960,960,],
[680,930,650,260,810,1400,1000,960,960,],
[780,930,650,760,810,1000,600,930,960,],
[980,630,650,760,810,1000,1000,960,960,],
]
scatter_data = [450, 620, 720, 320, 1400] #有点像自定义打点,然后使得重合
# 这个代码有点问题,如果因为做的是两个图重合,所以图最小值最大值要一致,所以一定scatter_data和y_data的最大值要求一致
box_plot = Boxplot() #这个使得两个箱线图重合
box_plot = (
box_plot.add_xaxis(xaxis_data=["expr 0", "expr 1", "expr 2", "expr 3", "expr 4"])
.add_yaxis(series_name="箱箱", y_axis=box_plot.prepare_data(y_data))
.set_global_opts(
title_opts=opts.TitleOpts(
pos_left="left", title="居左的标题"
),
xaxis_opts=opts.AxisOpts(
type_="category",
boundary_gap=True,
splitline_opts=opts.SplitLineOpts(is_show=False), #分割线显示与否
),
yaxis_opts=opts.AxisOpts( #y轴
type_="value",
name="km/s minus 299,000",
splitarea_opts=opts.SplitAreaOpts(
is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
),
)
.set_series_opts(tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}")) #按照名称/最小值/Q1/中值/Q3/最大值 展示
)
scatter = (
Scatter()
.add_xaxis(xaxis_data=["expr 0", "expr 1", "expr 2", "expr 3", "expr 4"])# 这个可以不输入值
.add_yaxis(series_name="", y_axis=scatter_data)
.set_global_opts(
title_opts=opts.TitleOpts( #标题
pos_left="10%",
pos_top="90%",
title="upper: Q3 + 1.5 * IQR \n\nlower: Q1 - 1.5 * IQR",
title_textstyle_opts=opts.TextStyleOpts(
border_color="#999", border_width=1, font_size=14
),
),
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(is_show=False),
axistick_opts=opts.AxisTickOpts(is_show=False),
),
)
)
grid = (
Grid(init_opts=opts.InitOpts(width="1000px", height="600px")) # 设置长宽
#箱线图的位置 调整数值之后可使得两者不交叠,可以不输入
.add(
box_plot,
grid_opts=opts.GridOpts(pos_left="10%", pos_right="10%", pos_bottom="15%"),
)
#点点的位置 调整数值之后可使得两者不交叠,可以不输入
.add(
scatter,
grid_opts=opts.GridOpts(pos_left="10%", pos_right="10%", pos_bottom="15%"),
)
.render("boxplot_light_velocity.html")
)
修改箱线图注释名称:tooltip_opts=opts.TooltipOpts(formatter=JsCode( ))
修改分类位置:.set_global_opts( legend_opts=opts.LegendOpts(pos_top="10%") )
x轴的命名(有规律):
.set_global_opts( axislabel_opts=opts.LabelOpts(formatter="实验 {value}"))
加入时间轴后需要注意的是箱线图是否会出界:
xaxis_opts=opts.AxisOpts( name_gap=30, boundary_gap=True, #选择False会使得箱线超过边界显示
(
Boxplot(init_opts=opts.InitOpts(width="1200px", height="600px"))
.add_xaxis(xaxis_data=axis_data)
.add_yaxis(
series_name="category0",
y_axis=data[0]["boxData"],
tooltip_opts=opts.TooltipOpts(
formatter=JsCode(
#这个改名称
"""function(param) { return [
'Experiment ' + param.name + ': ',
'upper: ' + param.data[0],
'Q1: ' + param.data[1],
'中值: ' + param.data[2],
'Q3: ' + param.data[3],
'最小值: ' + param.data[4]
].join('
') }"""
)
),
)
.add_yaxis(
series_name="category1",
y_axis=data[1]["boxData"],
)
.add_yaxis(
series_name="category2",
y_axis=data[2]["boxData"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Multiple Categories", pos_left="center"),
legend_opts=opts.LegendOpts(pos_top="10%"), #分类的标题位置
xaxis_opts=opts.AxisOpts(
name_gap=30,
boundary_gap=True, #选择False会使得箱线超过边界显示
splitarea_opts=opts.SplitAreaOpts(
areastyle_opts=opts.AreaStyleOpts(opacity=1)
),
axislabel_opts=opts.LabelOpts(formatter="实验 {value}"), #改x轴名称
),
yaxis_opts=opts.AxisOpts(
type_="value",
min_=-400,
max_=600,
),
datazoom_opts=[
opts.DataZoomOpts(type_="inside", range_start=0, range_end=20),
opts.DataZoomOpts(type_="slider", xaxis_index=0, is_show=True),
],
)
.render("multiple_categories.html")
)