import numpy as np,pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
from sklearn import datasets
"""
other example :http://seaborn.pydata.org/examples/index.html
默认图片svg格式,图片不失真
"""
class Plot():
"x,y,hue指的是DataFrame中的列名,对应下x,y,和标签值"
def __init__(self,df,graph_name,x = None,y=None,hue=None,cmap='magma'):
"""
:param df: DataFrame数据
:param graph_name: 保存图片名称,默认为svg格式
:param cmap:颜色色图
"""
self.df = df # DataFrame格式
self.graph_name = graph_name
self.cmap = cmap#颜色图
self.x = x
self.y = y
self.hue = hue#标签序列
self.fdir = r'./Graph'
if os.path.exists(self.fdir)==False:
os.mkdir(self.fdir)
self.fname = os.path.join(self.fdir,rf'{self.graph_name}.svg')
plt.rcParams['font.serif'] = 'Times New Roman'#显示字体
plt.rcParams['axes.unicode_minus'] = False#显示正负号
plt.rcParams['font.size'] ='12'#设置字体大小
def Heatmap(self):#热力图
grid_kws = {"height_ratios": (.9, .05), "hspace": .3}
f, ax = plt.subplots(2, gridspec_kw=grid_kws)
sns.heatmap(self.df,ax=ax[0],cbar_ax=ax[1],linewidth=0.0,\
linecolor ='white',cbar_kws={"orientation": "horizontal"}\
,cmap = self.cmap)
plt.savefig(self.fname, dpi=100)
plt.show()
def Normal_line_graph(self):#分布统计图,只能一次画一个图
sns.set_theme(style='white')
ax = sns.distplot(self.df.values,hist=True,kde=True,)
ax.set_ylabel('Density')
ax.set_xlabel('Value')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.savefig(self.fname, dpi=100)
plt.show()
def Normal_graph(self):
sns.displot(self.df ,x=self.x, hue=self.hue,\
y=self.y, kind="kde", fill=True)
#一个参数X是 画的图是分布曲线,有两个图时,画的是分布面
plt.ylabel('Density')
plt.xlabel('Value')
plt.savefig(self.fname, dpi=100)
plt.show()
def Box_graph(self):
sns.catplot(kind="box", data=df)#kind 有 box 和 box 两种模式
plt.savefig(self.fname, dpi=100)
plt.show()
def Reg_plot(self):
# sns.set_style("dark") # 背景样式
sns.jointplot(x=self.x, y=self.y,hue=self.hue, data=self.df, kind="reg",)
plt.savefig(self.fname, dpi=100)
plt.show()
def Error_graph(self):#时间序列的误差线
ax = sns.lineplot(x=self.x, y=self.y,hue=self.hue,\
data=self.df,ci=95)#置信度,绘制在95%的置信区间内
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax1 = ax.twinx()
ax1.scatter(x=self.df[self.x], y=self.df[self.y])
ax1.spines['right'].set_visible(False)
ax1.spines['top'].set_visible(False)
plt.axis('off')
plt.savefig(self.fname, dpi=100)
plt.show()
def Ploe_graph(self):
labels = self.df.index#评价指标
features = self.df.columns#评价特征(评价对象)
plt.style.use('bmh')
values = self.df.values
values = np.vstack((values,values[0]))#加入第一个values 的新的values
angles = np.array([np.linspace(0,2*np.pi,values.shape[0]-1,endpoint=False)]).T
angles = np.vstack((angles,angles[0]))#加入第一个angles的新的angles
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
i = 0#labels索引
for values_ in values.T:
ax.plot(angles, values_, 'o-', linewidth=1,alpha = 0.8,label=features[i])
ax.fill(angles,values_,alpha=0.5)
i = i+1
angle_ = angles * 180/np.pi
ax.set_thetagrids(angle_.flatten()[:-1], labels)
plt.legend(loc='best')
plt.savefig(self.fname, dpi=100)
plt.show()
#测试数据
data = np.random.uniform(1,10,(5,3))
# data = datasets.load_iris().data[:,:3]
df = pd.DataFrame(data,
columns=['sumh','nona','buy'],
# index=['apple','orange','bananan','juice','mike','cow']
)
Plot(df,'Pole',x='sumh',y='nona',cmap='nipy_spectral').Ploe_graph()
总的来说画的还算一般,可能origin画的更好看