plot画图 python 双线_Python中matplotlib的部分用法整理

导入的拓展包

matplotlib是Python中常用的画图工具, 在日常使用往往需要用到中文, 导入的同时也加入中文拓展包, 会方便很多.

import 

可以在导入程序包的同时, 设定好画图的分辨率以及画布的大小.

plt.rcParams['figure.dpi'] = 200
plt.rcParams['figure.figsize'] = [10,5]

简单折线图

给定一个pandas dataframe, 可以直接采用.plot()的方法画图 (无需import matplotlib).

import pandas as pd

index = [k for k in np.arange(0,1,0.001)]
c1 = pd.Series([k for k in index], index = index, name = 'y=x')
c2 = pd.Series([k*k for k in index], index = index, name = 'y=x^2')
df = pd.concat([c1,c2], axis = 1)

df.plot()

28df0a81b39212fd6a66149c24c6b99a.png

这样可以很方便地画出一个dataframe里面所有列的折线图, label就是列名. 而如果想要个性化列名的话, 可以选择一列一列地画. 对于pandas series来说, 当横坐标输入参数缺省时默认为series的index. 通过参数"color"和"label"可以来决定折线的颜色, 以及折线的标签.

plt.plot(df.iloc[:,0], color = 'black', label = 'y=x')
plt.plot(df.iloc[:,1], color = 'red', label = 'y=square(x)')
plt.legend()

5d262c5cc2af7ceb1ac6151b2e4f8636.png

而当需要标签为中文时, plt.legend()由于字体不包括中文, 会出问题. 而使用pltz.legend()就可以囊括中文.

plt.plot(df.iloc[:,0], color = 'black', label = '线性函数')
plt.plot(df.iloc[:,1], color = 'red', label = '抛物线')
pltz.legend()

5bfdd3890e24fcf46da0a1b22a8659fb.png

还可以设定x坐标轴的标签, y坐标轴的标签, 以及整个图的标题.

plt.plot(df.iloc[:,0], color = 'black', label = '线性函数')
plt.plot(df.iloc[:,1], color = 'red', label = '抛物线')
pltz.legend()
pltz.xlabel('x轴')
pltz.ylabel('y轴')
pltz.title('图1: 线性函数与抛物线的函数图像')

32b64978e3d96f24693e2f4d5032a7a8.png

当dataframe的列数过多时, 使用循环遍历画图即可. 全画完后再设定坐标标签, 标题, 图形标签等内容即可.

双y轴画图

有时画图的两个数据量级差距太大, 但又想画在同一张图上进行比较. 这个时候可以采用双y轴画图的方法. 注意对于坐标轴的处理要在每个axis的时候声明.

import numpy as np
import pandas as pd

index = [k for k in np.arange(0.1,1,0.001)]
c1 = pd.Series([1/k for k in index], index = index, name = 'y = 1/x')
c2 = pd.Series([np.log(k) for k in index], index = index, name = 'y = log(x)')
df = pd.concat([c1,c2], axis = 1)

fig = plt.figure()

ax1 = fig.add_subplot(111)
ax1.set_ylim([0,15])

ax1.plot(df.iloc[:,0], c = 'C0', label = 'y = 1/x')
ax1.legend()


ax2 = ax1.twinx()
ax2.set_ylim([-3,0])

ax2.plot(df.iloc[:,1], c = 'C1', label = 'y = log(x)')
ax2.legend()

eafcb195ccdd43e976bad68171915962.png

当想给两个纵坐标都取标题的时候, 右边的坐标取标题需要旋转一下角度 (通过参数 rotation 实现), 比较美观. 同时还可以调整坐标轴的标签与坐标轴的距离(通过参数labelpad调整).

import numpy as np
import pandas as pd

index = [k for k in np.arange(0.1,1,0.001)]
c1 = pd.Series([1/k for k in index], index = index, name = 'y = 1/x')
c2 = pd.Series([np.log(k) for k in index], index = index, name = 'y = log(x)')
df = pd.concat([c1,c2], axis = 1)

fig = plt.figure()

ax1 = fig.add_subplot(111)
ax1.set_ylim([0,15])

ax1.plot(df.iloc[:,0], c = 'C0', label = 'y = 1/x')
ax1.legend()
plt.ylabel('y = 1/x')

ax2 = ax1.twinx()
ax2.set_ylim([-3,0])

ax2.plot(df.iloc[:,1], c = 'C1', label = 'y = log(x)')
ax2.legend()
plt.ylabel('y = log(x)', rotation = 270, labelpad = 15);

ec0a5309b5af4fb46c925949204f01f0.png

如果需要让两个图的label放在一起的话,则需要手动设置一下label.

柱状图

DataFrame可以直接绘制柱状图。

import 

52d5cab94dbc8011f94588bcee14146a.png

柱子的宽度可以通过传递参数 width 来设置,一个label对应的宽度就是 width,上例中因为一个label对应两根柱子,所以每根柱子的宽度就是 width/2,width 的默认参数一般为0.8.

如果有需要,还可以在柱状图上标注具体的数值

index = ['Tom','Amy','Lily']
math = pd.Series([90,95,100], index = index, name = 'Math')
art = pd.Series([100,95,90], index = index, name = 'Art')
df = pd.concat([math,art], axis = 1)

width = 0.5

df.plot.bar(width = width);

plt.xticks(range(0,len(df)), df.index, rotation = 0);

for a, b in zip(range(0,len(df)), df.Math):
    plt.text(a-width/4, b, str(b), ha='center', va='bottom', fontsize=10)
for a, b in zip(range(0,len(df)), df.Art):
    plt.text(a+width/4, b, str(b), ha='center', va='bottom', fontsize=10)

629305e048836be02accc5b8b302de18.png

或者也可以绘制横着的柱状图

import pandas as pd
import numpy as np

index = ['Tom','Amy','Lily']
math = pd.Series([90,95,100], index = index, name = 'Math')
art = pd.Series([100,95,90], index = index, name = 'Art')
df = pd.concat([math,art], axis = 1)
df.plot.barh();

c992b97b7fe84b7fa6cd14a4ebeb9312.png

有需要的话也可以类似地在柱子上标注具体的数字

index = ['Tom','Amy','Lily']
math = pd.Series([90,95,100], index = index, name = 'Math')
art = pd.Series([100,95,90], index = index, name = 'Art')
df = pd.concat([math,art], axis = 1)

width = 0.5

df.plot.barh(width = width);

plt.yticks(range(0,len(df)), df.index, rotation = 0);

for a, b in zip(range(0,len(df)), df.Math):
    plt.text(b,a-width/4, str(b), ha='left', va='center', fontsize=10)
for a, b in zip(range(0,len(df)), df.Art):
    plt.text(b,a+width/4, str(b), ha='left', va='center', fontsize=10)

0534980a0788e9052520d0e71229a147.png

饼图

成分构成的饼图可以通过 pd.DataFrame.plot.pie() 直接绘制。

import pandas as pd

index = ['Tom','Amy','Lily']

component = pd.Series([0.15,0.25,0.3,0.1,0.2],
                      index = ['A','B','C','D','E'], 
                      name = 'component')
component.plot.pie()

c9b8d2aee111feb635449a6f78d6c701.png

可以通过参数 autopct 来给饼图贴上标签。他的取值可以是一个函数,输入变量为 DataFrame 中的数值,输出变量通过函数来自定义。

component.plot.pie(autopct = lambda x: '%.2f'%x+'%')

5a83d921a83d6ebd51a8b1146e967524.png
Matplotlib是一个流行的Python可视化库,它可以用来绘制各种类型的图表,包括线图、散点图、柱状图、饼图等等。在本文,我们将介绍如何使用Matplotlib绘制多个变量的图表。 首先,我们需要导入Matplotlib库,并生成一些数据用于绘图。例如,我们可以使用NumPy库生成一些随机数据: ```python import matplotlib.pyplot as plt import numpy as np # 生成数据 x = np.linspace(0, 10, 100) y1 = np.sin(x) y2 = np.cos(x) ``` 接下来,我们可以使用Matplotlibplot函数绘制两个不同的线图: ```python # 绘制两个线图 plt.plot(x, y1, label='sin') plt.plot(x, y2, label='cos') # 添加图例 plt.legend() # 显示图表 plt.show() ``` 这将生成一个包含两个线图的图表,并在图例显示每个线的标签。 如果我们想要绘制一个包含多个变量的图表,我们可以使用Matplotlib的subplot函数创建多个子图。例如,我们可以使用如下代码创建一个包含两个子图的图表: ```python # 创建包含两个子图的图表 fig, axs = plt.subplots(2) # 在第一个子图绘制sin函数 axs[0].plot(x, y1) axs[0].set_title('sin') # 在第二个子图绘制cos函数 axs[1].plot(x, y2) axs[1].set_title('cos') # 调整子图之间的间距 plt.tight_layout() # 显示图表 plt.show() ``` 这将生成一个包含两个子图的图表,每个子图都包含一个变量的图表。我们可以通过调整subplot函数的参数来创建包含更多子图的图表。 除了使用subplot函数,Matplotlib还提供了许多其他的绘图函数和工具,可以帮助我们创建各种类型的图表。例如,我们可以使用scatter函数创建散点图,使用bar函数创建柱状图,使用pie函数创建饼图等等。Matplotlib的文档包含了详细的说明和示例,可以帮助我们学习如何使用这些功能来绘制各种类型的图表。 总之,Matplotlib是一个功能强大的Python可视化库,可以帮助我们创建各种类型的图表。通过使用subplot函数和其他绘图函数,我们可以轻松地绘制包含多个变量的图表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值