Seaborn 可视化学习

Abstract

主要讲述绘制强化学习结果时遇到的seaborn操作。因此,本文主要讲述Lineplot的用法,以及图片的相关设置

线条绘制

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


# 单线绘制
data = pd.DataFrame({ "timestep":np.arange(100), "sr": np.arange(100)/100+0.1*np.random.randn(100)})
sns.lineplot(x="timestep",y="sr",data=data)
plt.show()

# 含有方差的单线绘制
data1 = np.arange(100)/100+0.1*np.random.randn(100)
data2 = np.arange(100)/100+0.1*np.random.randn(100)
data3 = np.arange(100)/100+0.1*np.random.randn(100)

data = pd.DataFrame({ "timestep":np.concatenate([np.arange(100) for i in range(3)],-1), 
                     "sr": np.concatenate([data1,data2,data3])})
sns.lineplot(x="timestep",y="sr",data=data)
plt.show()

Seaborn 可视化学习_第1张图片也就是说, 对于lineplot的输出,都是一维的向量。 对于多次的结果,我们需要将他们扁平化为一维数据,然后将数据的timesteps标注好。

import seaborn as sns
sns.lineplot(x,  # 横轴的标签, RL中一般为 timesteps, episodes, epochs
					  y,  # 纵轴的标签
					  data, # DataFrame object, 从此处调用数据
					  style, # 相同style标签的线 会有相同的颜色和线形表示
					  ci, # 表示是否设置方差  None, "sd" 和 默认的置信区间
					  hue, # 通过hue 可以设置多条线,并且设置legend
					  )

更具体的lineplot用法可以参照数据可视化(3)-Seaborn系列 | 折线图lineplot()

数据提取

因为seaborn.lineplot (也就是relplot(kind=“line”)) 仅支持pandas.DataFrame类型,因此,在对含有方差的线条,以及多条含有方差的线条进行绘制之前,需要将数据配置进DataFrame中。此处参考了使用seaborn绘制强化学习中的图片。

此处重点讲述 如何在一个图中画出多条线来

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


return1 = np.array([(np.arange(100)/100+0.1*np.random.randn(100)).clip(0,1) for i in range(3)])
return2 = np.array([ (1- np.exp(-np.arange(100)/100)+0.1*np.random.randn(100)).clip(0,1) for i in range(3)])

data = [return1,return2]
label = ["algo1","algo2"]

df = []

# ------------------- 重点 ----------------------------------
for i in range(2):
    # 此处 melt是将 (3,100)的结果压缩成 (300,)的结果,同时index标签是episodes, value的标签设置为 return
    df_elem = pd.DataFrame(data[i]).melt(var_name="episodes",value_name="return")
    # 将数据添加一行标签,都设置为 algoi
    df_elem["algo"]=label[i]
    df.append(df_elem)
    
# 将 list中的DF 合并成一个df, 之后df 有 episodes, return, algo 三个属性
# episodes用于区分第i episode,表示步长
# return表示值
# algo表示数据的类别,用于分成几条线,也用于区分线的类型
df = pd.concat(df)
# ------------------- 重点 ----------------------------------

# df.head()
sns.lineplot(x="episodes",y="return",data=df,
             hue="algo", # 用于将数据分成几条线
             style="algo", #用于表示数据的线形和颜色
             marker=False, # 可以设置中心点是否显示
            )
plt.show()


Seaborn 可视化学习_第2张图片

图片细节配置

前两部分保证可以正确的画出想要的曲线,该部分总结如何设置图像细节。

图形风格控制 分为两部分, 一部分是背景控制,另一方面是样式控制。

# 在jupyter notebook中需要在最开始设置 : 
sns.set()

# 1. 背景控制
# context = paper, talk, poster, notebook
#设置字体大小,边线
# rc = {"lines.linewidth": 2.5}
sns.set_context(context=None, font_scale=1, rc=None)

# 2. 样式控制
sns.set_style(style)
# style =  darkgrid,whitegrid,dark,white,ticks

# 默认样式
sns.axes_style()

{'axes.axisbelow': True,
 'axes.edgecolor': 'white',
 'axes.facecolor': '#EAEAF2',
 'axes.grid': True,
 'axes.labelcolor': '.15',
 'axes.linewidth': 0.0,
 'figure.facecolor': 'white',
 'font.family': ['sans-serif'],
 'font.sans-serif': ['Arial',
  'Liberation Sans',
  'Bitstream Vera Sans',
  'sans-serif'],
 'grid.color': 'white',
 'grid.linestyle': '-',
 'image.cmap': 'Greys',
 'legend.frameon': False,
 'legend.numpoints': 1,
 'legend.scatterpoints': 1,
 'lines.solid_capstyle': 'round',
 'text.color': '.15',
 'xtick.color': '.15',
 'xtick.direction': 'out',
 'xtick.major.size': 0.0,
 'xtick.minor.size': 0.0,
 'ytick.color': '.15',
 'ytick.direction': 'out',
 'ytick.major.size': 0.0,
 'ytick.minor.size': 0.0}

# 设置样式

sns.set_style({"axes.facecolor": ".9"})

sns.despine() 


# 4. 颜色设置
# 可以通过 color_palette(RGB) 或者 hls_palette(HLS) 设置颜色
sns.palplot(sns.hls_palette(n_colors=8)) 
# 具体见下一节

# 设置图片大小
plt.figure(dpi=300, figsize=(6, 4))

# 设置标签 
plt.xlabel("x label")
ax.set_ylabel('Y Label',fontsize=15, color='r')
# 设置刻度
plt.xticks( rotation=60)  # rotation: degree 
ax.tick_params(axis='y',labelsize=8)

plt.title()  # 用于设置标题

# legend 设置
legend = ax.legend()   # ax 从 lineplot获取
legend.texts[0].set_text("Whatever else")   # 设置图例的名字

## 移除图例的标题
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=handles[1:], labels=labels[1:])

## 移除图例
sns.lineplot(legend=False)
plt.legend(labels=[] , loc="upper right", bbox_to_anchor = (1,1), ncol=1)
 # 自己设置图例 , bbox_to_anchor 可以将图例放在图外


# 保存图片
plt.savefig(name, dpi=400, bbox_inches='tight')

颜色设置

参考文章
数据可视化Seaborn从零开始学习教程(二) 颜色调控篇
Seaborn(sns)官方文档学习笔记(第二章 斑驳陆离的调色板)

创建调色板

sns.color_palette() # 接受seaborn, matplotlib中的颜色名称, 也接受RGB,HEX颜色代码
sns.set_palette() # 用于设置调色板 

调色板分为 分类色板, 连续色板, 离散色板。
对于没有相关性的数据,我们一般就使用分类色板。

# 当前色板
current_palette = sns.color_palette()
sns.palplot(current_palette)

在这里插入图片描述"bright"效果更鲜艳:

在这里插入图片描述


# 有六种主题
# themes = ['deep', 'muted', 'pastel', 'bright', 'dark', 'colorblind']
sns.color_palette(every_theme) # 都可以查看结果

创建新的调色板

当需要的颜色超过想要的,或者想要修改亮度,饱和度

sns.palplot(sns.hls_palette(8, l=0.3,s=0.8))
sns.palplot(sns.color_palette("husl",8))

另外,也可以从Color Brewer中调用颜色表 (循环的颜色表)

sns.palplot(sns.color_palette("Paired"))

在这里插入图片描述


sns.palplot(sns.color_palette("Set2", 10))

在这里插入图片描述

交互

在jupyter notebook中可以进行交互

sns.choose_colorbrewer_palette("qualitative")

你可能感兴趣的:(软件包学习,学习,python,数据分析)