在matplotlib图中放置两个插图

时间:2018-10-16 14:05:53

标签: python matplotlib

我有一个csv文件,看起来像例如

SET ,A,B,C
1,1,1,1
2,2,2,2
3,3,3,3
4,4,4,4
5,5,5,5
6,6,6,6
7,7,7,7
8,8,8,8
9,9,9,9
10,10,10,7
15,20,23,17
20,30,33,27
25,40,43,37
30,50,53,47
35,60,63,57
40,70,73,67

我正在使用以下图形进行绘制:

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

data = pd.read_csv('test.csv', sep=',')

ax = data.plot(x="SET ", y=["A"],marker='^', linestyle='--', color='#CC2936')
data.plot(x="SET ", y=["B"],ax=ax,marker='o',linestyle='-',color='#CC2936')
data.plot(x="SET ", y=["C"], ax=ax,marker='^', linestyle='--', color='#08415C')

plt.show()

上面的代码产生了如下图所示:enter image description here

我想在此图中添加两个小插图:一个在左上角(当前的图例所在)放大了从x = 0到x = 10的数据,然后另一个在右下角显示了从x = 30到x = 40的数据进行了放大。对于matplotlib来说我是一个新手,所以可以提供任何帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

由于@DavidG发布的文档,我想我已经弄清楚了!

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

data = pd.read_csv('test.csv', sep=',')
set_p = data["SET "].tolist()
A = data["A"].tolist()
B = data["B"].tolist()
C = data["C"].tolist()

ax = data.plot(x="SET ", y=["A"],marker='^', linestyle='--', color='#CC2936')
data.plot(x="SET ", y=["B"],ax=ax,marker='o',linestyle='-',color='#CC2936')
data.plot(x="SET ", y=["C"], ax=ax,marker='^', linestyle='--', color='#08415C')

axins0 = inset_axes(ax, width="30%", height="30%", loc=2)
axins0.plot(set_p[:3], A[:3], marker='^', linestyle='--', color='#CC2936')
axins0.plot(set_p[:3], B[:3], marker='^', linestyle='--', color='#CC2936')
axins0.plot(set_p[:3], C[:3], marker='^', linestyle='--', color='#08415C')
axins0.tick_params(labelleft=False, labelbottom=False)

axins1 = inset_axes(ax, width="30%", height="30%", loc=4)
axins1.plot(set_p[6:], A[6:], marker='^', linestyle='--', color='#CC2936')
axins1.plot(set_p[6:], B[6:], marker='o', linestyle='-', color='#CC2936')
axins0.plot(set_p[6:], C[6:], marker='^', linestyle='--', color='#08415C')
axins1.tick_params(labelleft=False, labelbottom=False)


plt.show()

enter image description here

答案 1 :(得分:0)

尽管您很好地回答了自己的问题,但我回答的唯一区别是在绘制数据时使用了DataFrame中的条件,而不是使用切片/索引3:6:

我还手动指定插图的坐标,宽度和高度,而不是内置位置(位置),这给了我更大的自由度,可以在哪里放置插图以获得更好的美观。

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
data = pd.read_csv('test.csv', sep=',')

data.plot(x="SET ", y=["A"], marker='^', linestyle='--', color='#CC2936', ax=ax)
data.plot(x="SET ", y=["B"], marker='o',linestyle='-',color='#CC2936', ax=ax)
data.plot(x="SET ", y=["C"], marker='^', linestyle='--', color='#08415C', ax=ax)
plt.legend(loc=(0.02, 0.3), fontsize = 16)

ax2 = fig.add_axes([0.2, 0.6, 0.3, 0.25])
data[data["SET "]<=10].plot(x="SET ", y=["A"], marker='^', linestyle='--', color='#CC2936', ax=ax2)
data[data["SET "]<=10].plot(x="SET ", y=["B"], marker='o',linestyle='-',color='#CC2936', ax=ax2)
data[data["SET "]<=10].plot(x="SET ", y=["C"], marker='^', linestyle='--', color='#08415C', ax=ax2)
ax2.legend_.remove()
ax2.set_xlabel("")

ax3 = fig.add_axes([0.6, 0.2, 0.27, 0.25])
data[(data["SET "]>30) & (data["SET "]<=40)].plot(x="SET ", y=["A"], marker='^', linestyle='--', color='#CC2936', ax=ax3)
data[(data["SET "]>30) & (data["SET "]<=40)].plot(x="SET ", y=["B"], marker='o',linestyle='-',color='#CC2936', ax=ax3)
data[(data["SET "]>30) & (data["SET "]<=40)].plot(x="SET ", y=["C"], marker='^', linestyle='--', color='#08415C', ax=ax3)
ax3.legend_.remove()
ax3.set_xlabel("")

enter image description here