图来源: wiki-boxplot
使用dataframe直接画箱图
比如,有如下一组数据,直接使用dataframe.plot
画图 【官网了解更多】:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv(yourfile, sep='\t', header=0, index_col=0)
df.head()
df.plot(kind='box')
plt.show()
① 调整绘制箱图参数
df.plot(kind='box', # 选择画图类型
title='box title', # 图名称
showmeans=True, # 显示均值
meanline=True, # 均值线,True:使用虚线,False使用红色小三角
showfliers=True, # 是否显示异常值
rot=60, # 坐标值倾斜程度
figsize=(15,5), # 画图的大小
)
使用kind
参数选择画图类型:
显示均值时,设置显示线型:meanline=True
设置meanline=False
:均值显示为小三角
② 设置坐标轴
y轴设置:(x轴同理)
plt.ylabel('y label') # 设置y轴名称
plt.ylim([-2, 10]) # 设置y轴范围
plt.yticks([-2,3,5]) # 只显示指定坐标值
③ 图中添加文本或直线
plt.text(3, 5, 'text', # 在坐标(3,5)处添加文本"text"
fontsize=15, # 设置字体大小
color='red', # 设置为红色
alpha=0.5, # 显示透明度
)
# 也可以将文本写在图之外:(设置相应坐标即可)
plt.text(5, 2, 'new text', # 在坐标(3,5)处添加文本"text"
fontsize=15, # 设置字体大小
color='red', # 设置为红色
alpha=0.5, # 显示透明度
)
plt.plot((2.5,2.5), (0,5), # 直线横坐标x是从2.5->2.5, 纵坐标y是从0-5
color='orange', # 设置为橙色
alpha=0.5, # 设置透明度
linewidth=1, # 设置线条粗细
)
④ 更多参数
对特定图,有特定的模块与对应的参数,比如箱图boxplot
:箱图参数。所以也可以将这些参数作为dataframe.plot
的参数使用。
》上图截图来源:https://zhuanlan.zhihu.com/p/38199913
⑤ 散点图+箱图
展示两个数据对应的箱图组合,示例:
import matplotlib.pyplot as plt
import random
def random_lst(a, b, n):
lst = []
for i in range(n):
lst.append(random.uniform(a, b))
return lst
def data_plt(df1, df2, idx_lst):
fig, axs = plt.subplots(nrows=4, ncols=5, figsize=(12, 10), sharex=True) # , sharey=True)
for i in range(len(idx_lst)):
cx = i // 5 # 每行5个图
rx = i % 5
# print(cx, rx)
idx_name = idx_lst[i]
axs[cx, rx].scatter(random_lst(0.75, 1.25, len(df1[idx_name])) + random_lst(1.75, 2.25, len(df2[idx_name])),
list(df1[idx_name]) + list(df2[idx_name]), s=5, c='C7', alpha=0.4)
axs[cx, rx].boxplot([df1[idx_name], df2[idx_name]],
labels=['A', 'B'], showmeans=True, meanline=False, showfliers=True, widths=0.5)
axs[cx, rx].set_title(idx_name, fontsize=10)
axs[cx, rx].grid(axis="y")
plt.xlim(0, 3)
plt.xticks([1, 2], ['A', 'B'])
plt.show()
idx_lst = ... # list, 两个dataframe要选择的列
dataf1 = ... # dataframe, data1
dataf2 = ... # dataframe, data2
data_plt(dataf1, dataf2, idx_lst)
使用seaborn绘制箱图+散点图:
import seaborn as sns
# 创建示例数据
data1 = [1, 2, 3, 4, 5]
data2 = [2, 4, 6, 8, 10]
# 合并两组数据
combined_data = [data1, data2]
# 绘制箱线图
sns.boxplot(data=combined_data)
# 添加散点图
for i, data in enumerate(combined_data):
sns.stripplot(x=[i]*len(data), y=data, color='red', alpha=0.4)
# 显示图形
plt.show()
有多个子图:
import seaborn as sns
import matplotlib.pyplot as plt
# 创建示例数据
data1 = [1, 2, 3, 4, 5]
data2 = [2, 4, 6, 8, 10]
data3 = [3, 6, 9, 12, 15]
data4 = [4, 8, 12, 16, 20]
data5 = [5, 10, 15, 20, 25]
data6 = [6, 12, 18, 24, 30]
data7 = [7, 14, 21, 28, 35]
data8 = [8, 16, 24, 32, 40]
# 设置图形大小和布局
fig, axs = plt.subplots(2, 2, figsize=(10, 8))
# 绘制子图1
sns.boxplot(data=[data1, data2], width=0.4, ax=axs[0, 0]).set_title('Group 1')
sns.stripplot(data=[data1, data2], color='red', alpha=0.4, size=4, ax=axs[0, 0])
# 绘制子图2
sns.boxplot(data=[data3, data4], width=0.4, ax=axs[0, 1]).set_title('Group 2')
sns.stripplot(data=[data3, data4], color='red', alpha=0.4, size=4, ax=axs[0, 1])
# 绘制子图3
sns.boxplot(data=[data5, data6], width=0.4, ax=axs[1, 0]).set_title('Group 3')
sns.stripplot(data=[data5, data6], color='red', alpha=0.4, size=4, ax=axs[1, 0])
# 绘制子图4
sns.boxplot(data=[data7, data8], width=0.4, ax=axs[1, 1]).set_title('Group 4')
sns.stripplot(data=[data7, data8], color='red', alpha=0.4, size=4, ax=axs[1, 1])
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()
def boxplt(df0, df1, label0=0, label1=1, nrows=4, hsize=7, ymax=None):
names = df0.columns
fig, axs = plt.subplots(nrows=nrows, ncols=5, figsize=(9, hsize)) # , sharex=True) # , sharey=True)
for i, idx_name in enumerate(names):
cx = i // 5
rx = i % 5
# 添加散点图
sns.stripplot(data=[list(df0[idx_name]), list(df1[idx_name])], ax=axs[cx, rx],
palette='dark:black',
alpha=0.4, # 点颜色透明度
size=2, # 点大小
jitter=0.2, # 点分散程度(小数值,越大越分散)
)
# 添加箱图
sns.boxplot(data=[list(df0[idx_name]), list(df1[idx_name])], ax=axs[cx, rx],
showmeans=True, #箱图显示均值
width=0.5, #设置箱子之间距离,为1时,每个箱子之间距离为0
showfliers=False, #异常值关闭显示(有散点图显示,避免重复)
)
# box_uni = axs[cx, rx].boxplot([df0[idx_name], df1[idx_name]],
# labels=[label0, label1], showmeans=True, meanline=False, showfliers=True,
# # notch=True, patch_artist=True,
# )
axs[cx, rx].set_title(idx_name, fontsize=8)
axs[cx, rx].grid(axis="y")
if ymax is not None:
axs[cx, rx].set_ylim(0, ymax) # (0, 0.1) # (0, 0.5)
plt.show()
附:python画图示例官网:matplotlib https://matplotlib.org/stable/gallery/index.html
数据的处理
- 取log
df2 = np.log2(df+0.0001) # 将数值取log
- zscore:
from scipy import stats
df.shape[0] # 行数
df.shape[1] # 列数
zs_arr = stats.zscore(df, axis=1, ddof=0) # 注意输出的是数组型(array)