首页 >图片操作 > 内容

数据分析 NO.15 数据可视化

2023年9月18日 22:49

数据可视化

先创建一个画布,然后往画布填充元素,然后展现出来

import numpy as np import matplotlib.pyplot as plt%matplotlib inlineX = np.linspace(0, 2*np.pi,100)# 均匀的划分数据 ,  0到2pi  100份均分Y = np.sin(X)Y1 = np.cos(X)plt.title("Hello World!!")plt.plot(X,Y)plt.plot(X,Y1)
  1. BAR CHART 柱状图
    统计某个特征的频率或者数值
data = [5,25,50,20]plt.bar(range(len(data)),data)    #逗号前面是X,后面是Y

在这里插入图片描述

data = [5,25,50,20]plt.barh(range(len(data)),data)

在这里插入图片描述

3.多个Bar

data = [[5,25,50,20],        [4,23,51,17],        [6,22,52,19]]X = np.arange(4)plt.bar(X + 0.00, data[0], color = 'b', width = 0.25,label = "A")plt.bar(X + 0.25, data[1], color = 'g', width = 0.25,label = "B")plt.bar(X + 0.50, data[2], color = 'r', width = 0.25,label = "C")    #横轴的移动plt.legend()   #加了label就要用.legend()

在这里插入图片描述

np.arange:
在这里插入图片描述

data = [[5,25,50,20],        [4,23,51,17],        [6,22,52,19]]X = np.arange(4)plt.bar(X, data[0], color = 'b', width = 0.25)plt.bar(X, data[1], color = 'g', width = 0.25,bottom = data[0])plt.bar(X, data[2], color = 'r', width = 0.25,bottom = np.array(data[0]) + np.array(data[1]))    #纵轴的移动。plt.show()

在这里插入图片描述
分组柱状图与堆积柱状图
在这里插入图片描述

3.散点图
散点图用来衡量两个连续变量之间的相关性

N = 50x = np.random.rand(N)y = np.random.rand(N)plt.scatter(x, y)

在这里插入图片描述

N = 50x = np.random.rand(N)y = np.random.rand(N)colors = np.random.randn(N)area = np.pi * (15 * np.random.rand(N))**2  #  调整大小plt.scatter(x, y, c=colors, alpha=0.5, s = area)   #alpha  透明度

在这里插入图片描述

N = 50x = np.random.rand(N)y = np.random.rand(N)colors = np.random.randint(0,2,size =50)plt.scatter(x, y, c=colors, alpha=0.5,s = area)

在这里插入图片描述
在实际的工作中,遇到要求通过散点反应该列数据的分布情况,即纵坐标是其本身的数值,横坐标是索引(个人理解),可以通过excel画,python的话输入代码

plt.plot(df["age"],".",markersize=50)

4.直方图
直方图是用来衡量连续变量的概率分布的。在构建直方图之前,我们需要先定义好bin(值的范围),也就是说我们需要先把连续值划分成不同等份,然后计算每一份里面数据的数量。
(例子:比如把年龄分好)

a = np.random.rand(100)plt.hist(a,bins= 20)   #bins 是把下面切成多少块plt.ylim(0,15)

在这里插入图片描述
直方图增加边框,即增加边框颜色

plt.hist(edgecolor="black")

5.BOXPLOTS 线箱图
boxlot用于表达连续特征的百分位数分布。统计学上经常被用于检测单变量的异常值,或者用于检查离散特征和连续特征的关系

在这里插入图片描述
上四分位数:是%75分位数 下四分位数:是%25分位数
其中可以通过plt.boxplot(x),也可以通过df本身的dpi进行表示df.plot(kind=box)
第一种方式x为一个二维数组,第二种方式则为一个dataframe,列名为每一个箱线。
第一种方式可以用plt.boxplot(df.values)表示是相同的

x = np.random.randint(20,100,size = (30,3))plt.boxplot(x)plt.ylim(0,120)plt.xticks([1,2,3],['A','B','C'])  #xticks   在X轴上的什么位置填入一个labelplt.hlines(y = np.mean(x,axis = 0)[1] ,xmin =0,xmax=3)

在这里插入图片描述
存在几个箱线图数据样本量不等的情况,可以通过Series幅值后,通过字典变dataframe的方式进行绘制,对应index的value值若不存在则为NaN。箱线会自动滤除空值情况。

s1 = pd.Series(list1)s2 = pd.Series(list2)s3 = pd.Series(list3)s4 = pd.Series(list4)result = {"a":s1,"b":s2,"c":s3,"d":s4}result = pd.DataFrame(result)result.plot(kind="box")  #以下三种写法都可以result.boxplot()plt.boxplot(result.values)

6.颜色的调整和文字的增加

颜色代码:颜色代码

fig, ax = plt.subplots(facecolor='darkseagreen')data = [[5,25,50,20],        [4,23,51,17],        [6,22,52,19]]X = np.arange(4)plt.bar(X, data[0], color = 'darkorange', width = 0.25,label = 'A')plt.bar(X, data[1], color = 'steelblue', width = 0.25,bottom = data[0],label = 'B')plt.bar(X, data[2], color = 'violet', width = 0.25,bottom = np.array(data[0]) + np.array(data[1]),label = 'C')ax.set_title("Figure 1")plt.legend()

在这里插入图片描述

增加文字:
plt.text(0

W = [0.00,0.25,0.50]for i in range(3):    for a,b in zip(X+W[i],data[i]):        plt.text(a,b,"%.0f"% b,ha="center",va= "bottom")  #a是X轴,b是Y轴。  "%.0f"% b显示文字格式plt.xlabel("Group")plt.ylabel("Num")plt.text(0.0,48,"TEXT")

在这里插入图片描述

在数据可视化的过程中,图片中的文字经常被用来注释图中的一些特征。使用annotate()方法可以很方便地添加此类注释。在使用annotate时,要考虑两个点的坐标:被注释的地方xy(x, y)和插入文本的地方xytext(x, y)。其中官方参考文档见此:地址
其他用户参考地址
plt.annotate()
s:str, 注释信息内容
xy:(float,float), 箭头点所在的坐标位置
xytext:(float,float), 注释内容的坐标位置
weight: str or int, 设置字体线型,其中字符串从小到大可选项有{‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’}
color: str or tuple, 设置字体颜色 ,单个字符候选项{‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’},也可以’black’,‘red’等,tuple时用[0,1]之间的浮点型数据,RGB或者RGBA, 如: (0.1, 0.2, 0.5)、(0.1, 0.2, 0.5, 0.3)等
arrowprops:dict,设置指向箭头的参数,字典中key值有①arrowstyle:设置箭头的样式,其value候选项如’->‘,’|-|‘,’-|>‘,也可以用字符串’simple’,‘fancy’等,详情见顶部的官方项目地址链接。
connectionstyle:设置箭头的形状,为直线或者曲线,候选项有’arc3’,‘arc’,‘angle’,‘angle3’,可以防止箭头被曲线内容遮挡
color:设置箭头颜色,见前面的color参数。

X = np.linspace(0, 2*np.pi,100)# 均匀的划分数据Y = np.sin(X)Y1 = np.cos(X)plt.plot(X,Y)plt.plot(X,Y1)plt.annotate('Points',         xy=(1, np.sin(1)),         xytext=(2, 0.5), fontsize=16,         arrowprops=dict(arrowstyle="->"))plt.title("这是一副测试图!")

在这里插入图片描述

在这里插入图片描述

plt.rc("font", family="SimHei", size="15")#此行代码很好理解!#显示中文  其中字体可以使用Latex字体效果不错plt.rcParams["axes.unicode_minus"]=False#用来显示负号mpl.rcParams['agg.path.chunksize'] = 10000#画布不够大时,修改后面的参数plt.figure(figsize=(12,8))#调整jupyter 里图的大小

7.Subplots 在一块画布上画出多个图形
代码中.subplot(211)只是将画布分为2行1列在几个块绘图

plt.figure(figsize=(15, 8))plt.subplot(211)plt.plot(vir)plt.subplot(212)plt.plot(vir)

内部参数可参考:链接

%pylab.inlinepylab.rcParams['figure.figsize'] = (10, 6) # 调整图片大小
fig, axes = plt.subplots(nrows=2, ncols=2,facecolor='darkslategray',figsize=(18,12))   #把画布分成2行,2列ax0, ax1, ax2, ax3 = axes.flatten()  #展开     这两行代码相当于底图       也可以通过索引进行选择 ax0.plot(df[“age”])ax0.set_title("minzgi“”)ax0.set_xticks([10,20,30])   colors = ['red', 'tan', 'lime'] ax0.hist(x, n_bins, normed=1, histtype='bar', color=colors, label=colors) ax0.legend(prop={'size': 10}) ax0.set_title('bars with legend')ax1.hist(x, n_bins, normed=1, histtype='bar', stacked=True)ax1.set_title('stacked bar')ax2.hist(x, n_bins, histtype='step', stacked=True, fill=False)ax2.set_title('stack step (unfilled)') Make a multiple-histogram of data-sets with different length. x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]] ax3.hist(x_multi, n_bins, histtype='bar') ax3.set_title('different sample sizes')fig.tight_layout()       # Adjust subplot parameters to give specified padding.  调整好看的大小plt.show()

循环列表subplot绘图

fig,axes = plt.subplots(ncols=3,nrows=6,figsize=(20,40))for index,ax in enumerate(axes.flatten()):    ax.plot(df["JTBefore"],df.iloc[:,index],".")    ax.set_xlabel("径跳量值",fontsize=16)    ax.set_ylabel("归一化值",fontsize=16)    ax.set_xticks([i for i in range(10)]) #划分横坐标    ax.set_xticklabels([i for i in range(10)]) #重新横坐标命名    ax.grid(axis="x,linestyle="--")    ax.set_title(df.columns[index] + "_相关性:%s"%(df["JTBefore"].corr(df.iloc[:,index])),fontsize=16)plt.savefig(r"C:\Users\Administrator\Desktop\a.png")

8.共享X 轴,Y轴

# ShareX or ShareYN_points = 100000n_bins = 20# Generate a normal distribution, center at x=0 and y=5x = np.random.randn(N_points)y = .4 * x + np.random.randn(100000) + 5fig, axs = plt.subplots(1, 2, sharey=True, tight_layout=True)   #sharey 共享Y轴, tight_layout更紧凑,为了更好看。# We can set the number of bins with the `bins` kwargaxs[0].hist(x, bins=n_bins)axs[1].hist(y, bins=n_bins)

在这里插入图片描述

双Y轴
在这里插入图片描述

  1. Pandas API
df.plot.scatter(x = "height",y = "weight",c = "born")或df.plot(kind="scatter",x="180",y="77",c="1918")

在这里插入图片描述

df['birth_state'].value_counts()[:50].plot.barh()

在这里插入图片描述

grouped = df.groupby("birth_state")gs = grouped.size()gs[gs >=10].sort_values().plot.bar()

在这里插入图片描述

df[['height','weight']].plot.hist()

在这里插入图片描述

df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),                     'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])df4.plot.hist(alpha=0.5)

在这里插入图片描述
其中直方图内的参数:
normed:是否将直方图的频数转换成频率
cumulative:是否需要计算累计频数或频率;
可参考:链接

df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])df.plot(kind = "box")

在这里插入图片描述
pandas.DataFrame.plot一个坐标系画多张图片:

ax = du_offer.plot(x='max_load', y='w0', legend='w0')du_offer.plot(x='max_load', y='w1', legend='w1', title=du, ax=ax)

在这里插入图片描述
.plot()相关参数:链接
10. seaborn

displot() 做单个连续变量的数据分布

import seaborn as snssns.set()   #全局设置
tips = sns.load_dataset("tips")iris = sns.load_dataset("iris")   #导入数据sns.distplot(iris.sepal_length)   #单变量的直方图

在这里插入图片描述
notebook 中

!+ 空格    #表示这行代码是在终端中进行的!
# 多个变量在一幅图中比较sns.distplot(iris.sepal_length,bins = 20,kde = False)sns.distplot(iris.sepal_width,bins = 20,kde = False)

在这里插入图片描述

.jointplot() 返回两个变量之间的关系的

# 返回的结果是散点图,以及两个变量的直方图sns.jointplot(x = "sepal_length",y = "sepal_width",data=iris)  #返回3个,一个是他们的关系,然后是两个数据的分别直方图或sns.jointplot(x=tips["total_bill"],y=tips["tip"])

在这里插入图片描述

.pairplot() 传入一个数据,会把数据的所有特征以两两的之间的关系都做出来

sns.pairplot(iris)

离散分类的变量

sns.stripplot(x="day", y="total_bill", data=tips);

在这里插入图片描述

sns.stripplot(x="day", y="total_bill", data=tips, jitter=True,hue = "smoker");   #jitter=True  上密集的线部分打散 #hue=""   对后面的分组

在这里插入图片描述
工作代码

result_data = pd.DataFrame()value_mean = []pur_data = [sv_qian_3,sv_hou_3,sv_qian_4,sv_hou_4,sv_qian_16,sv_hou_16]for i in pur_data:    result_data = result_data.append(i)    value_mean.append(np.mean(i).values[0])plt.figure(figsize=(18,12))plt.rc("font", family="SimHei", size="18")sns.stripplot(x="name",y="SV", data=result_data,jitter=True);for i,value in enumerate(value_mean):    plt.annotate("平均值为:%d"%int(value),xy=(i,5),fontsize=15)# value_meanplt.ylabel("XX值",fontsize=18)plt.xlabel("XXX",fontsize=18)

在这里插入图片描述

# POINT不会重叠 sns.swarmplot(x="day", y="total_bill", data=tips);  #点 完全不重叠

在这里插入图片描述

sns.barplot(x="tip", y="day",hue = "smoker", data=tips,estimator=np.median)  #横轴默认的是平均数,可以用estimator进行修改。

在这里插入图片描述

linear relationships
展示两个连续性变量的关系

sns.lmplot(x="total_bill", y="tip", data=tips)   #输入两个连续性变量sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),scatter_kws={"s": 80})#data=anscombe.query("dataset == 'I'")  选择数据中“i”, scatter_kws=  设置点的大小

阴影部分就是他的置信区间

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),           ci=None, scatter_kws={"s": 80});     # ci=None  不展示置信区间

在这里插入图片描述

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),           order=2, ci=None, scatter_kws={"s": 80});     #order =2 表示最高到2次项   y=wx+b+w1X**2   作用是进行拟合

在这里插入图片描述

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),           robust=True, ci=None, scatter_kws={"s": 80});   #robust=True   不拟合异常点!!

在这里插入图片描述

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)

在这里插入图片描述

关于图例的使用可参考:
Legend的使用
图例的位置设置参数如下:可设置在图片外,大于1即可
plt.legend(bbox_to_anchor=(1.05,1.04))

多子图绘制legend()

ax[0][1].scatter(np.random.choice(1000, len(df2)), df2['Tw'], s=0.5, c='blue', label='蓝色:未报警数据') #绘图时,给定label标签handles01, labels01 = ax[0][1].get_legend_handles_labels()ax[0][1].legend(handles01, labels01, loc='upper left')

df.plot()参数详解:
df.plot参数详解
在这里插入图片描述
关于matplotlib的命令与格式可参考于:
参数配置文件与参数配置

图形文件的保存:
plt.savefig()

plt.savefig("figpth.png",dpi=400,bbox_inches="tight")#其中dpi是分辨率,bbox_inches是可以裁剪图表周围的空白处。

在这里插入图片描述
rc方法:
在这里插入图片描述
多个图例绘制在一幅图里面:(注意是plt 不是df.plot)

plt.scatter(data = df_ceshi[df_ceshi["标签"] == 1],x = "temp" ,y = "wensheng")plt.scatter(data = df_ceshi[df_ceshi["标签"] == 2],x = "temp" ,y = "wensheng")plt.legend(["1","2"])plt.show()for name,group in grouped:    print(group)    print(type(group))    plt.scatter(data = group,x = "temp" ,y = "wensheng")    #plt.legend(["1","2"])    plt.show()

在这里插入图片描述
添加水平直线:

plt.axvline(x=90,ls="-",c='red')plt.axhline(y=15,ls="-",c="yellow")#添加水平直线 

添加水平区域阴影

plt.axvspan(xmin=1,xmax=10,facecolor="b",alpha=0.3)plt.axhspan(ymin=1,ymax=10,facecolor="b",alpha=0.3)#添加水平阴影

更换横纵坐标的显示以及刻度(以下以X轴为例):
主要采用的函数的方法是plt.xticks()

plt.scatter(data=df,x="Unnamed: 0",y="temp_1")plt.scatter(data=df,x="Unnamed: 0",y="temp_2")plt.legend(["temp1","temp2"])plt.xticks(ticks=[2,4,6],labels=["低速","中速","高速"])#ticks显示的刻度,后面label是更换刻度显示

注意上面的ticks显示的刻度是根据横坐标的个数来定的也就是只能选取整数,可以使用range(x,y)
主要不要和plt.xlabel()弄混淆,其功能是添加横坐标标签!

工作代码:

"""@FILE   : Feature_count_plot.py@Modify Time:2020/6/16@Description:根据各个特征进行作图,特征PCA降维"""import pandas as pdimport numpy as npimport matplotlib.pyplot as pltplt.rc("font",family="SimHei",size=20)plt.rcParams["axes.unicode_minus"]=Falsefrom sklearn.decomposition import PCAimport osdef exists(path):    if not os.path.exists(path):        os.makedirs(path)def feature_plot(path,df):#根据特征直接作图    plt.figure(figsize=(18, 12))    df = df.iloc[:,5:-1]#只有特征项    # df = df.applymap(lambda x:round(x,2))#频域作图,数据格式修改为复数    for columns, val in df.iteritems():        plt.plot(val)        plt.title(columns)        exists(os.path.dirname(path) + "\\" + "All_plot")        plt.savefig(os.path.dirname(path) + "\\" + "All_plot" + "\\" + columns + ".png")        plt.clf()def data_pca(path,df):#将多维特征进行降维然后作图    # df = df.applymap(lambda x:round(x,2))    x_data = df.iloc[:,5:-2]    estimator = PCA(n_components=2)    X_pca=estimator.fit_transform(x_data)    plt.plot(X_pca[:,0])    plt.title("主成分_1")    exists(os.path.dirname(path) + "\\" + "Pca_plot")    plt.savefig(os.path.dirname(path) + "\\" + "Pca_plot" + "\\" + "feature_1.png")    plt.clf()    plt.plot(X_pca[:,1])    plt.title("主成分_2")    plt.savefig(os.path.dirname(path) + "\\" + "Pca_plot" + "\\"  + "feature_2.png")def All_plot(df):#多图在一个图上    # df = pd.read_csv(r"E:\轴承特征指标数据-程序\太北SS4 0276A 11\result\time\result.csv")    df = df.iloc[:, 5:-1]    fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(18, 12))    ax = []    ax = axes.flatten()    i = 0    for columns, val in df.iteritems():        ax[i].plot(val)        ax[i].set_title(columns)        #     ax[i].set_xticks([4000,8000,12000])        #     ax[i].set_xticklabels(["低速","中速","高速"])        i += 1    fig.tight_layout()    plt.savefig(r"C:\Users\yunda\Desktop\a.png")    plt.suptitle('Title',x=0.5,y=0.5)#增加标题,里面参数有x=,y=设置坐标if __name__ == "__main__":    path = r"E:\轴承特征指标数据-程序\太北HXD1 1433B 35\result\fre\result.csv"    df = pd.read_csv(path)    feature_plot(path,df)    data_pca(path,df)    # All_plot(path,df)

图效果
在这里插入图片描述

不同的数据绘制在不同的图中并将其重复绘图保存:
可是开始用plt.figure(num=“fig”)指定num,后续要对其中某个图操作,在操作前加入plt.figure(num=“fig”) 指定即可。

ex1:plt.figure(num="fig1")plt.plot(df["Temp_1"])plt.figure(num="fig2")plt.plot(df["Temp_2"])plt.figure(num="fig2")plt.savfig()#在这里就只保存了"fig2"图ex2:plt.figure(num="fig1")plt.figure(num="fig2")for i in [1,2]:    plt.figure(num="fig1")    plt.plot(df["Temp_"+str(i)])for i in [3,4]:    plt.figure(num="fig2")    plt.plot(df["Temp_"+str(i)])plt.figure(num="fig1")plt.savefig(r"C:\Users\yunda\Desktop\1.png")plt.figure(num="fig2")plt.savefig(r"C:\Users\yunda\Desktop\2.png")

清空画布:

Use clf() to clear figure.Use cla() to clear axes.

matplotblib画图去除图中白边(即坐标轴旁边空白部分):
方法一:

self.fig.tight_layout(pad=1.5)plt.fig.tight_layout(pad=1.5)

方法二:也可以使用 参数subplots_adjust()

plt.subplos_adjust(left=0.06,right=0.97,top=0.94,bottom=0.08) #设置白边宽度

设置坐标轴字体的方向。
plt.xlabel(“K”,rotation=0)

弹窗绘图(可放大缩小):

#弹窗绘图import sysimport timeimport numpy as npfrom matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5if is_pyqt5():    from matplotlib.backends.backend_qt5agg import (        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)else:    from matplotlib.backends.backend_qt4agg import (        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)from matplotlib.figure import Figureclass ApplicationWindow(QtWidgets.QMainWindow):    def __init__(self):        super().__init__()        self._main = QtWidgets.QWidget()        self.setCentralWidget(self._main)        layout = QtWidgets.QVBoxLayout(self._main)        static_canvas = FigureCanvas(Figure(figsize=(5, 3)))        layout.addWidget(static_canvas)        self.addToolBar(NavigationToolbar(static_canvas, self))#         dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3)))#         layout.addWidget(dynamic_canvas)#         self.addToolBar(QtCore.Qt.BottomToolBarArea,#                         NavigationToolbar(dynamic_canvas, self))#         self._static_ax = static_canvas.figure.subplots()#         t = np.linspace(0, 10, 501)#         self._static_ax.plot(t, np.tan(t), ".")#         self._dynamic_ax = dynamic_canvas.figure.subplots()#         self._timer = dynamic_canvas.new_timer(#             100, [(self._update_canvas, (), {})])#         self._timer.start()#     def _update_canvas(self):#         self._dynamic_ax.clear()#         t = np.linspace(0, 10, 101)#         # Shift the sinusoid as a function of time.#         self._dynamic_ax.plot(t, np.sin(t + time.time()))#         self._dynamic_ax.figure.canvas.draw()if __name__ == "__main__":    qapp = QtWidgets.QApplication(sys.argv)    app = ApplicationWindow()    app.show()    qapp.exec_()

matlabl库绘图中增加次坐标:

fig, ax1 = plt.subplots(figsize=(18,12))ax2 = ax1.twinx()ax1.plot(vir_g, color='b')ax2.plot(speed, color='g')    ax2.set_yticks([-800,10],[' '," "])ax1.set_yticks([-40,-20,0,20,40,60,80,100],['',"","",""])for index,i in enumerate(result_index):    plt.axvline(x=i*4096,ls="--",c='red')    plt.annotate(dis["station"][index],xy=(i*4096-200, 80),fontsize=16,rotation=90)

在这里插入图片描述
绘图背景中增加网格线
采用matlab里面的plt.grid(linestyle=‘-.’)方法。

让坐标轴倒序排列显示
通过设置plt.xlim(6000,0)即可显示,y轴同理。

绘制热力图
主要有两种方式:matlab和seaborn两个库 相关链接
方法一:

import matplotlib.pyplot as pltfrom matplotlib import font_managerimport numpy as npnp.random.seed(30)data = np.random.randint(70, 100, (30, 8))   #主要为二维数组plt.imshow(data)plt.xticks(range(0, 8), ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'])plt.yticks(range(0, 30), np.array(range(1, 31), dtype='U3'))# 显示颜色条plt.colorbar()plt.title('30个产品的ABCDEFGH指标热力图', fontsize=25, color='#0033cc', fontproperties=font_manager.FontProperties(fname="STKAITI.TTF"))plt.show()

方法二:

plt.figure(dpi=120)# sns.heatmap(data=result["车体垂向平稳指标"])# cmap=plt.get_cmap('Greens')# tt = pd.DataFrame(result_lis,index=["1~3Hz","3~6Hz","6~10Hz","10~20Hz"])tt = pd.DataFrame(result_lis,index=["10~20Hz","6~10Hz","3~6Hz","1~3Hz"])sns.heatmap(data=tt,cmap=plt.get_cmap('Greens'))#sns.heatmap(data=mm,cmap=sns.cubehelix_palette(as_cmap=True)) 换颜色风格plt.xticks(range(5, 50,5), [str(11000+i*100) for i in range(11)])# plt.yticks(range(0, 4),["1~3Hz","3~6Hz","6~10Hz","10~20Hz"])plt.yticks(rotation=0)plt.title("测试",fontsize=14)plt.xlabel("测试",fontsize=14)plt.ylabel("测试",fontsize=14)

在这里插入图片描述

坐标移动-横纵坐标0可以重合
主要用的函数为 plt.gca() #gca大概可以为get current axes的意思
对图中坐标轴的4个支柱“bottom”,“top”,“left”,“right”进行移动
用法代码主要如下:

ax = plt.gca()ax.xaxis.set_ticks_position('bottom')   #锁定X轴,需要先锁定才能移动。实际情况可以不用此行代码ax.spines['bottom'].set_position(('data',0))  #将X轴移动到0的位置 “data”只指0是数值的移动ax.spines['left'].set_position(('data',0)) #移动Y轴ax.spines['top'].set_color('none')  # 设置顶部支柱的颜色为空ax.spines['right'].set_color('none')  # 设置右边支柱的颜色为空ax.spines['top'].set_visible(False)  #此方法也可以消除框ax.spines['right'].set_visible(False)

也可以参考此链接

自定义图例
工作中遇到了,在一副图中绘制两次plt.plot(),但是实际再给图例的时候plt.legend()时,给出默认为第一个图,手动也不行。
后查询资料发现需要将绘图方法以变量获取即可,见一下代码:

fig, ax1 = plt.subplots(figsize=(18,12))ax2 = ax1.twinx()                            #共用X轴m1, = ax1.plot(df["公里标"],df["rms"],"blue")m2, = ax2.plot(df["公里标"],df["speed"],"red")plt.legend([m1,m2],["有效值","速度"])

seaborn实在柱状图
工作中需要统计各机务段情况,按照排序显示,可以采用sns.barplot()的方式。

sns.barplot(x,y,data,order=["xx"],orient="h")

Pyecharts
以下方法均是基于版本V1.7.1所用

pip install pyecharts==v1.7.1

柱状图

x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data = [123, 153, 89, 107, 98, 23]df  = pd.DataFrame({'x':x_data,'y':y_data})x_data = list(df['x'])y_data = list(df['y'])bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('', y_data)bar.render_notebook()

条形图

bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('', y_data)#条形图bar.reversal_axis()bar.set_series_opts(label_opts=opts.LabelOpts(position="right"))  #数字标签最右边bar.render_notebook()

折线图

x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data = [123, 153, 89, 107, 98, 23]line = Line()       line.add_xaxis(x_data)line.add_yaxis('', y_data)      line.render_notebook()

箱线图

x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data = [[random.randint(100, 200) for i in range(10)] for item in x_data]Box = Boxplot()Box.add_xaxis(x_data)Box.add_yaxis("", Box.prepare_data(y_data))Box.render_notebook()

在这里插入图片描述
散点图

x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data = [123, 153, 89, 107, 98, 23]scatter = Scatter()scatter.add_xaxis(x_data)scatter.add_yaxis('', y_data)scatter.render_notebook()

热力图

data = [[i, j, random.randint(0, 100)] for i in range(24) for j in range(7)]hour_list = [str(i) for i in range(24)]week_list = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']heat = HeatMap()heat.add_xaxis(hour_list)heat.add_yaxis("",week_list, data)        heat.render_notebook()

在这里插入图片描述
饼图

cate = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']data = [123, 153, 89, 107, 98, 23]pie = Pie()pie.add('', [list(z) for z in zip(cate, data)])pie.render_notebook()

漏斗图

cate = ['访问', '注册', '加入购物车', '提交订单', '付款成功']data = [30398, 15230, 10045, 3109, 1698]funnel = Funnel()funnel.add("", [list(z) for z in zip(cate, data)])          funnel.render_notebook()

在这里插入图片描述
仪表盘

gauge = Gauge()gauge.add("", [('转化率',10)])          gauge.render_notebook()

在这里插入图片描述
词云

words = [    ("hey", 230),    ("jude", 124),    ("dont", 436),    ("make", 255),    ("it", 247),    ("bad", 244),    ("Take", 138),    ("a sad song", 184),    ("and", 12),    ("make", 165),    ("it", 247),    ("better", 182),    ("remember", 255),    ("to", 150),    ("let", 162),    ("her", 266),    ("into", 60),    ("your", 82),    ("heart", 173),    ("then", 365),    ("you", 360),    ("can", 282),    ("start", 273),    ("make", 265),]wc = WordCloud()wc.add("", words)wc.render_notebook()

表格

table = Table()headers = ["City name", "Area", "Population", "Annual Rainfall"]rows = [    ["Brisbane", 5905, 1857594, 1146.4],    ["Adelaide", 1295, 1158259, 600.5],    ["Darwin", 112, 120900, 1714.7],    ["Hobart", 1357, 205556, 619.5],    ["Sydney", 2058, 4336374, 1214.8],    ["Melbourne", 1566, 3806092, 646.9],    ["Perth", 5386, 1554769, 869.4],]table.add(headers, rows)table.render_notebook()

地图

province = [    '广东',    '湖北',    '湖南',    '四川',    '重庆',    '黑龙江',    '浙江',    '山西',    '河北',    '安徽',    '河南',    '山东',    '西藏']data = [(i, random.randint(50, 150)) for i in province]map_ = Map()map_.add("", data, 'china')map_.render_notebook()

矩阵图

data = [    {"name": "湖南",     "children": [             {"name": "长沙",              "children": [                  {"name": "雨花区", "value": 55},                  {"name": "岳麓区", "value": 34},                  {"name": "天心区", "value": 144},              ]},             {"name": "常德",              "children": [                      {"name": "武陵区", "value": 156},                      {"name": "鼎城区", "value": 134},              ]},             {"name": "湘潭", "value": 87},             {"name": "株洲", "value": 23},     ],     },    {"name": "湖北",     "children": [             {"name": "武汉",              "children": [                  {"name": "洪山区", "value": 55},                  {"name": "东湖高新", "value": 78},                  {"name": "江夏区", "value": 34},              ]},             {"name": "鄂州", "value": 67},             {"name": "襄阳", "value": 34},     ],     },    {"name": "北京", "value": 235},    {"name":"广东","children":[{"name":"广州","value":330}]}]treemap = (    TreeMap()    .add("", data))treemap.render_notebook()

在这里插入图片描述
组合图表

product = ['帽子','衣服','手套','鞋子','裙子','电脑']A = [100,200,300,400,300,200,100]B = [10,20,30,40,30,20,10]bar = Bar()bar.add_xaxis(product)bar.add_yaxis("",B)bar.add_yaxis("",A)bar.render_notebook()

在这里插入图片描述
堆积柱状图

product = ['帽子','衣服','手套','鞋子','裙子','电脑']A = [100,200,300,400,300,200,100]B = [10,20,30,40,30,20,10]bar = Bar()bar.add_xaxis(product)bar.add_yaxis("",A,stack="stack1")bar.add_yaxis("",B,stack="stack1")bar.render_notebook()

在这里插入图片描述
双图组合

x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data_bar = [123, 153, 89, 107, 98, 23]y_data_line = [153, 107, 23, 89, 123, 107]line = Line()line.add_xaxis(x_data)line.add_yaxis('', y_data_line)bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('', y_data_bar)       overlap = line.overlap(bar)overlap.render_notebook()

在这里插入图片描述
时间轴

#时间begin = datetime.date(2020, 4, 1)end = datetime.date(2020, 4, 20)#X轴,分类变量cate = ['Apple', 'Huawei', 'MI', 'Oppo', 'Vivo', 'Samsung']# 随机生成数据的方法def random_data(n):     return [random.randint(100, 200) for i in range(n)]# 新建一个timeline对象tl = Timeline()#for i in range((end - begin).days + 1):    day = begin + datetime.timedelta(days=i)    bar = Bar()    bar.add_xaxis(cate)    bar.add_yaxis('电商渠道', random_data(len(cate)))        tl.add(bar, day)tl.render_notebook()

在这里插入图片描述
选项卡

#多少个选项卡cate = ['Apple', 'Huawei', 'MI', 'Oppo', 'Vivo', 'Samsung']# 时间范围,建立x轴begin = datetime.date(2020, 4, 1)end = datetime.date(2020, 4, 20)date_list = [str(begin + datetime.timedelta(days=i))             for i in range((end - begin).days + 1)]# 随机生成数据的方法def random_data(n):     return [random.randint(0, 100) for i in range(n)]# 新建一个tab对象,选项卡tab = Tab()for c in cate:    line = Line()    line.add_xaxis(date_list)    line.add_yaxis('', random_data(len(date_list)))                #把line图表放在选项卡上    tab.add(line, c)tab.render_notebook()

在这里插入图片描述
单画布多图

x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data = [123, 153, 89, 107, 98, 23]bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('', y_data)       line = Line()line.add_xaxis(x_data)line.add_yaxis('', y_data)line2 = Line()line2.add_xaxis(x_data)line2.add_yaxis('', y_data)page = Page()page.add(bar, line,line2)page.render_notebook()

并行多图

x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data = [123, 153, 89, 107, 98, 23]bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('', y_data)       line = Line()line.add_xaxis(x_data)line.add_yaxis('', y_data)        grid = Grid()grid.add(bar,grid_opts=opts.GridOpts(pos_bottom="65%", pos_left="50%"))grid.add(line,grid_opts=opts.GridOpts(pos_left="15"))grid.render_notebook()

在这里插入图片描述
3D散点图

data = [[random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)] for i in range(100)]#建立图表对象scatter3D = Scatter3D()#相关数据加入scatter3D.add("", data,              xaxis3d_opts=opts.AxisOpts(min_=0,max_=100),              yaxis3d_opts=opts.AxisOpts(min_=0,max_=100),              zaxis3d_opts=opts.AxisOpts(min_=0,max_=100)             )    scatter3D.render_notebook()

3D直方图

data = [[i, j, random.randint(0, 100)] for i in range(24) for j in range(7)]hour_list = [str(i) for i in range(24)]week_list = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']bar3D = Bar3D()bar3D.add(        "",        data,        xaxis3d_opts=opts.Axis3DOpts(hour_list),        yaxis3d_opts=opts.Axis3DOpts(week_list),        zaxis3d_opts=opts.Axis3DOpts(),    )bar3D.render_notebook()

3D地图

province = [    '广东',    '湖北',    '湖南',    '四川',    '重庆',    '黑龙江',    '浙江',    '山西',    '河北',    '安徽',    '河南',    '山东',    '西藏']data = [(i, random.randint(50, 150)) for i in province]map3d = Map3D()map3d.add("", data_pair=data, maptype='china')map3d.render_notebook()

3D地球 太不常用了

from pyecharts.faker import POPULATIONmapglobe = (    MapGlobe()    .add_schema()    .add(        series_name="",        maptype="world",        data_pair=POPULATION[1:]    ))mapglobe.render_notebook()

pyecharts配置项

#画布大小配置bar = Bar(init_opts=opts.InitOpts(width='1000px', height='400px'))#主题配置theme_list = ['chalk', 'dark', 'essos','infographic','light', 'macarons','purple-passion', 'roma', 'romantic','shine','vintage','walden', 'westeros', 'white','wonderland']bar = (    Bar(init_opts=opts.InitOpts(theme='vintage'))    .add_xaxis(x_data)    .add_yaxis('', y_data_1)    .add_yaxis('', y_data_2))#网页标题bar = Bar(init_opts=opts.InitOpts(page_title='Test'))#将图片导出到本地,是hmtl格式bar.render()# 背景颜色配置bar = Bar(init_opts=opts.InitOpts(bg_color='rgba(255,182,193)'))

标题配置项

#标题bar.set_global_opts(title_opts=opts.TitleOpts(title="我是主标题", subtitle='我是副标题'))#标题位置bar.set_global_opts(title_opts=opts.TitleOpts(title="我是主标题",subtitle='我是副标题',pos_left='60%',pos_top='10%'))#标题颜色bar.set_global_opts(title_opts=opts.TitleOpts(title="我是主标题", subtitle='我是副标题',title_textstyle_opts=opts.TextStyleOpts( color='red'),subtitle_textstyle_opts=opts.TextStyleOpts(color='green')))

图例的配置

x_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data_1 = [123, 153, 89, 107, 98, 23]y_data_2 = [231, 321, 135, 341, 245, 167]# 图例配置bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('公司A', y_data_1)bar.add_yaxis('公司B', y_data_2)# bar.set_global_opts(legend_opts=opts.LegendOpts(is_show=False, pos_left='center',pos_bottom='90%')) #输入center也可以

坐标轴设置

#名字bar.set_global_opts(yaxis_opts=opts.AxisOpts(name='销售额/万元'))bar.set_global_opts(xaxis_opts=opts.AxisOpts(name='手机品牌'))#坐标轴最大最小bar = (    Bar()    .add_xaxis(x_data)    .add_yaxis('图例1', y_data_1)    .add_yaxis('图例2', y_data_2)    .set_global_opts(yaxis_opts=opts.AxisOpts(min_=20, max_=500)))#不显示坐标轴bar.set_global_opts(xaxis_opts=opts.AxisOpts(axisline_opts=opts.AxisLineOpts(is_show=False)))bar.set_global_opts(yaxis_opts=opts.AxisOpts(axisline_opts=opts.AxisLineOpts(is_show=False)))#颜色配置bar.set_series_opts(itemstyle_opts=opts.ItemStyleOpts(color='rgba(255,182,193)'))#透明度设置bar.set_series_opts(itemstyle_opts=opts.ItemStyleOpts(opacity=0.6))#描边bar.set_series_opts(itemstyle_opts=opts.ItemStyleOpts(border_color='black'))

标签配置项

#关闭标签bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))#标题样式配置bar = (    Bar()    .add_xaxis(x_data)    .add_yaxis('', y_data_1)    .add_yaxis('', y_data_2)    .set_series_opts(label_opts=opts.LabelOpts(is_show=True,                                               # 标签的位置。可选                                               # 'top','left','right','bottom','inside','insideLeft','insideRight'                                               # 'insideTop','insideBottom', 'insideTopLeft','insideBottomLeft'                                               # 'insideTopRight','insideBottomRight'                                               position='insideBottomRight')))#常用标记点bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('', y_data)       bar.set_series_opts(        # 为了不影响标记点,这里把标签关掉        label_opts=opts.LabelOpts(position='inside'),        markpoint_opts=opts.MarkPointOpts(            data=[                opts.MarkPointItem(type_="max", name="最大值"),                opts.MarkPointItem(type_="min", name="最小值"),                opts.MarkPointItem(type_="average", name="平均值"),            ]))bar.render_notebook()#自定义标记点bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('', y_data)bar.set_series_opts(        # 为了不影响标记点,这里把标签关掉        label_opts=opts.LabelOpts(is_show=False),        markpoint_opts=opts.MarkPointOpts(            data=[                # 根据坐标定位                opts.MarkPointItem(coord=['Xiaomi', 150],value='标记'),   #xiaomi为x轴,150为y轴            ]))bar.render_notebook()#标记线,区别就是markpoint变成marklinex_data = ['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu']y_data = [123, 153, 89, 107, 98, 23]# 特定维度上的特殊值bar = Bar()bar.add_xaxis(x_data)bar.add_yaxis('', y_data)bar.set_series_opts(        # 为了不影响标记点,这里把标签关掉        label_opts=opts.LabelOpts(is_show=False),        markline_opts=opts.MarkLineOpts(            data=[                opts.MarkLineItem(type_="min", name="最小值"),                opts.MarkLineItem(type_="max", name="最大值"),                opts.MarkLineItem(type_="average", name="平均值")            ]))bar.render_notebook()#自定义标记线bar.set_series_opts(        # 为了不影响标记点,这里把标签关掉        label_opts=opts.LabelOpts(is_show=False),        markline_opts=opts.MarkLineOpts(            data=[                opts.MarkLineItem(x="Xiaomi", name="x=xiaomi"),                opts.MarkLineItem(y=100, name="y=100")            ]))            #标记区域date_list = ['10月{}日'.format(i) for i in range(1, 32)]data = [random.randint(10, 100) for _ in date_list]line = Line()line.add_xaxis(date_list)line.add_yaxis('', data)line.set_series_opts(markarea_opts=opts.MarkAreaOpts(            data=[                opts.MarkAreaItem(name="十一黄金周", x=("10月1日", "10月7日"),y=(0,100)),            ]))line.render_notebook()

双Y轴

v1 = ["10月30日", "10月31日", "11月01日", "11月02日", "11月03日", "11月04日", "11月05日"]  # x轴坐标v2 = [46, 39, 40, 34, 48, 54, 57] # 总用户量v3 = [9, 6, 6, 9, 9, 5, 10] # 已转化的用户量v4 = [i for i in range(0, 101)] # y轴v5 = [19.57, 15.38, 15, 26, 18, 9.2, 17.5, 17.42] #覆盖率# v2,v3做分组柱状图、v5做折线图bar = Bar() # 这里可以选择主题bar.add_xaxis(v1)bar.add_yaxis("总用户量", v2)bar.add_yaxis("已转化的用户量", v3)#增加双Y轴bar.extend_axis(        yaxis=opts.AxisOpts(            axislabel_opts=opts.LabelOpts(formatter="{value}%")        ))line = Line()line.add_xaxis(v1)line.add_yaxis("覆盖率", v5, yaxis_index=1,)overlap = bar.overlap(line)overlap.render_notebook()

在这里插入图片描述

数据可视化理论基础
数据可视化的目的:是洞悉蕴含在数据中的现象和规律,从而帮助用户高效而准确的进行决策

数据可视化流程:确定分析目标 - 收集数据 - 处理数据 - 确认图表 - 数据可视化

(1)确定分析目标:即确定需要可视化的数据是围绕什么主题或者目的来组织的,整个数据可视化的过程都必须紧贴主题,不能盲目分析。不然最终可视化产品与实际需求是不符的。比如说某直播企业领导突然和你说,我想看看我们直播业务的稳定性,你不是默默就说了句“收到”就回去做了。而是要真正问清楚领导最关心哪些方面,因为稳定性三个字涉及范围太大了,是关于营收的,还是关于系统的,还是关于主播的,还是关于观众的,还需要举例几个具体的指标结合沟通,尽可能明确需求方“最”关心的点。

(2)收集数据及数据处理:围绕着分析目的去收集数据,处理数据时候需要注意缺失值、异常值、无效值的处理。

(3)确认图表:如何选择图表是数据可视化的难点。

确认图表实际上也是确认数据的关系,数据常见关系有5种:

(3.1)构成:主要关注每个部分所占整体的百分比,如果你想表达的信息包括:“份额”、“百分比”以及“预计将达到百分之多少”,这时候可以用到饼图;

(3.2)比较:可以展示事物的排列顺序——是差不多,还是一个比另一个更多或更少呢?“大于”、“小于”或者“大致相当”都是比较相对关系中的关键词。

(3.3)趋势:是最常见的一种时间序列关系,关心数据如何随着时间变化而变化,每周、每月、每年的变化趋势是增长、减少、上下波动或基本不变,这时候使用线图更好地表现指标随时间呈现的趋势;

(3.4)分布:是关心各数值范围内各包含了多少项目,典型的信息会包含:“集中”、“频率”与“分布”等,这时候使用直方图;同时,还可以根据地理位置数据,通过地图展示不同分布特征;

(3.5)联系:主要查看两个变量之间是否表达出我们预期所要证明的模式关系,比如预期销售额可能随着折扣幅度的增长而增长,这时候可以用气泡图来展示,用于表达“与……有关”、“随……而增长”、“随……而不同”变量间的关系。

在这里插入图片描述


参考文章:https://blog.csdn.net/TeddyBob/article/details/90759020

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时候联系我们修改或删除,在此表示感谢。

特别提醒:

1、请用户自行保存原始数据,为确保安全网站使用完即被永久销毁,如何人将无法再次获取。

2、如果上次文件较大或者涉及到复杂运算的数据,可能需要一定的时间,请耐心等待一会。

3、请按照用户协议文明上网,如果发现用户存在恶意行为,包括但不限于发布不合适言论妄图

     获取用户隐私信息等行为,网站将根据掌握的情况对用户进行限制部分行为、永久封号等处罚。

4、如果文件下载失败可能是弹出窗口被浏览器拦截,点击允许弹出即可,一般在网址栏位置设置

5、欢迎将网站推荐给其他人,网站持续更新更多功能敬请期待,收藏网站高效办公不迷路。

      



登录后回复

共有0条评论