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

本文深入探讨数据可视化的核心技巧,涵盖从数据预处理到图表选择的全过程。通过实例解析,读者将学会运用Python进行数据可视化,掌握饼图、散点图、直方图等多种图表的制作方法,以及如何利用Seaborn和Pyecharts库提升图表质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据可视化

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

import numpy as np 
import matplotlib.pyplot as plt
%matplotlib inline

X = 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 = 50
x = np.random.rand(N)
y = np.random.rand(N)

plt.scatter(x, y)

在这里插入图片描述

N = 50
x = 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 = 50
x = 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)   # 去掉上下边界:whis=0,去掉异常值:showfliers=False
plt.ylim(0,120)
plt.xticks([1,2,3],['A','B','C'])  #xticks   在X轴上的什么位置填入一个label


plt.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)

饼图
主要通过方法plt.pie()进行绘制;
以下是 plt.pie() 函数的一些常用参数和它们的作用:

x: 数值数据,表示每个扇形的数据大小。
labels: 扇形的标签,与数据 x 中的元素一一对应。
autopct: 用于控制扇形上百分比数字的格式。
colors: 用于指定绘制扇形的颜色。
startangle: 饼图的起始角度。
explode: 用于“突出”某个扇形,使其与其他扇形分离。
shadow: 是否绘制阴影效果。
radius: 饼图的半径。
pctdistance: 百分比标签与中心的距离。
labeldistance: 标签与中心的距离。
wedgeprops: 用于设置扇形的属性,如宽度、填充等。
textprops: 用于设置文本的属性,如字体大小、颜色等。

以下为示例代码:

# 数据
sizes = [215, 130, 245, 210]
labels = ['Python', 'C++', 'Ruby', 'Java']
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']
explode = (0.1, 0, 0, 0)  # 突出第一个扇形

# 绘制饼图
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=140)#autopct='%1.1f%%' 参数用于在每个扇形上显示百分比,shadow=True 使饼图具有阴影效果,startangle=140 设置了饼图的起始角度。

# 确保饼图是圆形的
plt.axis('equal')

# 显示图表
plt.show()


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.inline
pylab.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 ShareY
N_points = 100000
n_bins = 20

# Generate a normal distribution, center at x=0 and y=5
x = np.random.randn(N_points)
y = .4 * x + np.random.randn(100000) + 5

fig, axs = plt.subplots(1, 2, sharey=True, tight_layout=True)   #sharey 共享Y轴, tight_layout更紧凑,为了更好看。

# We can set the number of bins with the `bins` kwarg
axs[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 sns
sns.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_mean
plt.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,ec="black")
plt.axhspan(ymin=1,ymax=10,facecolor="b",alpha=0.3,ec="black")#添加水平阴影,ec:线边框

更换横纵坐标的显示以及刻度(以下以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()弄混淆,其功能是添加横坐标标签!

工作代码:
fig.delaxes(ax[3][3])#删除第4行第4列的子图,替换为空白


"""
@FILE   : Feature_count_plot.py
@Modify Time:2020/6/16
@Description:
根据各个特征进行作图,特征PCA降维
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc("font",family="SimHei",size=20)
plt.rcParams["axes.unicode_minus"]=False
from sklearn.decomposition import PCA
import os

def 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()
    fig.delaxes(ax[3][3])#删除第4行第4列的子图,替换为空白
    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.subplots_adjust(left=None,bottom=None,right=None,top=None,hspace=0,wspace=0.2) #调整图与图之间的间隔

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

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

#弹窗绘图
import sys
import time

import numpy as np

from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
if 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 Figure


class 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)

在这里插入图片描述
方式二:

plt.figure(figsize=(18,8))
plt.plot([i,i],df_speed.loc[i,["min_speed","max_speed"]].to_list(),"b")

plt.xticks(rotation=45)
plt.ylabel("速度km/h",fontsize=16)

plt.twinx()  #第二幅图 声明一下 X轴即可
plt.plot(df_speed["wave_deep"], ".",color="red")   
plt.ylabel("波深/mm",fontsize=16)


plt.title("上行区间内速度趋势",fontsize=18)

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

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

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

import matplotlib.pyplot as plt
from matplotlib import font_manager
import numpy as np
np.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()的方式。

result  = pd.DataFrame({"A":[1,2,3],"B":[4,5,6]})
sns.barplot(x="A",y="B",data=result,order=result["xx"],orient="h") #order需要排序的话,需要提前将数据排序即 result = result.sort_values("A")

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

pip install pyecharts==v1.7.1
from pyecharts.charts import *
from pyecharts.components import Table
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import random
import datetime
import pyecharts
# pyecharts.globals._WarningControl.ShowWarning = False
import pandas as pd
from pyecharts.charts import Bar

柱状图

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()

在这里插入图片描述
以下为实际工作代码

Box = Boxplot(init_opts=opts.InitOpts(width='1000px', height='600px'))
Box.add_xaxis(col)

v1 = [i[1:4] for i in Box.prepare_data(value_1)]#这里Box.prepare_data()是计算箱线图5个指标的方法,可以把第一个值和最后个值设置与临近的相同,则绘制出来的图,没有异常阈值
v1_result=[]
for i in v1:
    m = i.copy()
    m.insert(0,i[0])
    m.insert(5,i[-1])
    v1_result.append(m)

v2 = [i[1:4] for i in Box.prepare_data(value_2)]
v2_result=[]
for i in v2:
    n = i.copy()
    n.insert(0,i[0])
    n.insert(5,i[-1])
    v2_result.append(n)


Box.add_yaxis("镟轮前", v1_result)
Box.add_yaxis("镟轮后", v2_result)

Box.set_global_opts(
    title_opts=opts.TitleOpts(title="镟轮前后有效值对比箱线图"),
    yaxis_opts=opts.AxisOpts(name="有效值/g"),
    xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-90),splitline_opts=opts.SplitLineOpts(is_show=True)),
)


line_1 = Line()
# line.add_xaxis(col[::2])
line_1.add_xaxis(col)
line_1.add_yaxis('', [round(i[2],2) for i in v1_result],z=2)


line_2 = Line()
# line.add_xaxis(col[::2])
line_2.add_xaxis(col)
line_2.add_yaxis('', [round(i[2],2) for i in v2_result],z=2)


# grid = Grid()
# grid.add(Box, grid_opts=opts.GridOpts(pos_bottom="35%"))

# overlap = line.overlap(Box)
overlap = Box.overlap(line_1)
overlap_2 = overlap.overlap(line_2)

# grid.render_notebook()
# overlap.render_notebook()

grid = Grid()                     #以下三步是为了让X横坐标显示完全
grid.add(overlap_2, grid_opts=opts.GridOpts(pos_bottom="35%"))
grid.render_notebook()

X横坐标显示完全可参考链接
在这里插入图片描述

散点图

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.set_global_opts(
title_opts=opts.TitleOpts(title="主标题"),
yaxis_opts=opts.AxisOpts(name="Y坐标"),
xaxis_opts=opts.AxisOpts(name="x坐标")
)


bar.render_notebook()
bar.render("C://a.html")#生成html文件

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

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 POPULATION


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

在这里插入图片描述

绘图效果美化
1.使用Rosé Pine主题,他并非是一个库,而是一个主题。可以前往github(链接)下载该主题,下载完成后,输入主题

plt.style.use(r"C:\Users\Administrator\Desktop\rose-pine-matplotlib-main\rose-pine-matplotlib-main\themes\rose-pine-dawn.mplstyle")      #获取主题文件位置
plt.figure(figsize=(16,8))
plt.plot(result_sv["Whdb"])

在这里插入图片描述

2.使用mplcyberpunk库,赛博朋克可以提供恰到好处的颜色和背景,还能为图片添加发光效果。详细还可以参考该链接

import mplcyberpunk
import matplotlib.pyplot as plt

plt.style.use("cyberpunk")
plt.plot(df["sv])


mplcyberpunk.make_lines_glow()    #设置线条发光
mplcyberpunk.add_underglow()      #设置面积图
mplcyberpunk.add_glow_effects()   #设置线条发光+面积图

在这里插入图片描述
3.使用GruvBox,其也不算为一个库,而是一个文件。使用时调用即可

matplotlib.style.use("./gruvbox.mplstyle")

在这里插入图片描述

使用python的matlab库绘制3D折线图
通过时间、空间、结果值三个维度绘制3D折线图,其中代码及效果如下:参考链接

fig = plt.figure(figsize=(26,12))

# 创建一个3D绘图区域
ax = fig.add_subplot(111, projection='3d')
 
# 绘制3D折线图
for index,value in enumerate(df.columns[1:].to_list()):
    x = [i for i in range(len(x))]
    y = [index for i in range(len(x))]
    z = df[value].to_list()
    ax.plot(x, y, z, label='3D line plot')

ax.set_xlabel('区间值')
ax.set_ylabel('诊断时间')
ax.set_zlabel('有效值/g')
plt.xticks([i for i in range(len(df["区间值"]))],df["区间值"].to_list(),fontsize=12)
plt.yticks([i for i in range(len(df.columns[1:]))],df.columns[1:].to_list(),fontsize=12)

plt.title("区间有效值",fontsize=18)

原图
在这里插入图片描述
3D图
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值