一,数据导入
这样的数据格式
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy
#读取数据
df = pd.read_excel("data.xlsx")
二,处理数据
#分别读取数据,将其转化为数据框
x_title = df.title.dropna().tolist() #转化为列表
color = df.color.dropna().tolist()
data = []
for i in range(len(x_title)):
value = "value{}".format(i + 1)
value = df[value].dropna().tolist()
data.append(value)
#输出
['Control', 'ISO', 'ISO+6VT', 'ISO+12VT', 'ISO+24VT'] #x_title
['#B09C85', '#DC0000', '#00A087', '#3C5488', '#770335'] #color
[[17.2, 17.9, 16.1], [31.7, 32.7, 33.8], [23.4, 24.9, 24.5], [20.1, 21.3, 20.7], [18.3, 19.9, 18.6]]#data
三,柱状图
#柱状图数据前处理
x = np.linspace(1, len(x_title), len(x_title)) #分类先设置为整数,便于后期优化
mean = []
std = []
data = np.array(data)
for i in data:
mean.append(i.mean())#平均值
std.append(i.std())#标准差
ax.bar(x, mean, color='white', edgecolor=color, linewidth=1)
四,误差棒
#一个一个添加误差棒
for i in range(len(x_title)):
ax.errorbar(x[i], mean[i], yerr=std[i], ecolor=color[i], elinewidth=1, capsize=15, capthick=1)
五,横坐标转化
majorLocator = FixedLocator(x)
minorLocator = AutoMinorLocator(len(x_title)-1)
ax.xaxis.set_major_locator(majorLocator)
ax.set_xticklabels(x_title)
#在前面需要导入相关包, 主要作用是将x轴调均匀, 然后改变 相应位置的值
六,#标注p值,plt_p函数是统计两组数据之间的p值
#标注p值,plt_p函数是统计两组数据之间的p值
def plt_p(a, b, c):
x1 = [x[a]+0.05, x[b]-0.05]
x2 = (x[a]+x[b])/2.0
y1 = [c, c]
y2 = c + 1
ax.plot(x1, y1, color="black", linewidth=1)
ax.text(x2, y2, get_p_value_r(data[a], data[b]), verticalalignment='center', horizontalalignment='center', **font_style)
#然后画含p的柱状图
m = 1
c = (data[m].mean() + data[m].std())
plt_p(0, m, c*1.35)
plt_p(m, 4, c*1.35)
plt_p(m, 3, c*1.2)
plt_p(m, 2, c*1.05)
七,美化坐标轴
#x,y轴字体设置
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
rotation_mode="anchor", **font_style)
yticklabel_text = ax.get_yticklabels()
for i, j in enumerate(yticklabel_text):
j.set_family("Arial")
j.set_fontsize(24)
#j.set_rotation(45)
ax.margins(0.25)
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_linewidth(1)
ax.spines["left"].set_linewidth(1)
ax.tick_params(axis="y", which="major", length=12, width=1)
ax.tick_params(axis="x", which="major", length=12, width=1)
ax.set_ylim(0, 50)
plt.savefig("柱状图.svg", format="svg")
plt.show()
八, 最终效果图
总结, 不同的柱状图, p值处理这一块存在缺陷, 不能随机应变, 颜色这一块(可以引入其他API接口)