我在将Seaborn Jointplot放在多列中时遇到了问题subplot.
import pandas as pd
import seaborn as sns
df = pd.DataFrame({'C1': {'a': 1,'b': 15,'c': 9,'d': 7,'e': 2,'f': 2,'g': 6,'h': 5,'k': 5,'l': 8},
'C2': {'a': 6,'b': 18,'c': 13,'d': 8,'e': 6,'f': 6,'g': 8,'h': 9,'k': 13,'l': 15}})
fig = plt.figure();
ax1 = fig.add_subplot(121);
ax2 = fig.add_subplot(122);
sns.jointplot("C1", "C2", data=df, kind='reg', ax=ax1)
sns.jointplot("C1", "C2", data=df, kind='kde', ax=ax2)
Run Code Online (Sandbox Code Playgroud)
注意如何只将一部分jointplot放置在子图内,其余部分留在另外两个图框内.我想要的是distributions同时插入内部subplots.
有人能帮忙吗?
假设我有这个代码:
num_rows = 10
num_cols = 1
fig, axs = plt.subplots(num_rows, num_cols, sharex=True)
for i in xrange(num_rows):
ax = axs[i]
ax.plot(np.arange(10), np.arange(10)**i)
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果图有太多信息,现在我想选择1个轴并在新图中单独绘制它
我尝试过做这样的事情
def on_click(event):
axes = event.inaxes.get_axes()
fig2 = plt.figure(15)
fig2.axes.append(axes)
fig2.show()
fig.canvas.mpl_connect('button_press_event', on_click)
Run Code Online (Sandbox Code Playgroud)
但它没有奏效.这样做的正确方法是什么?搜索文档并抛出SE几乎没有任何有用的结果
编辑:
我不介意重新绘制所选择的轴,但我不知道如何判断哪个轴被选中,所以如果该信息以某种方式可用,那么它对我来说是一个有效的解决方案
编辑#2:
所以我设法做了这样的事情:
def on_click(event):
fig2 = plt.figure(15)
fig2.clf()
for line in event.inaxes.axes.get_lines():
xydata = line.get_xydata()
plt.plot(xydata[:, 0], xydata[:, 1])
fig2.show()
Run Code Online (Sandbox Code Playgroud)
这似乎是"工作"(所有其他信息丢失 - 标签,线条颜色,线条样式,线条宽度,xlim,ylim等...)但我觉得必须有一个更好的方法来做到这一点
谢谢
我们有一个代码,用于从input.txt文件创建数字.我们需要在一个子图中组合其中两个图.图1中的数据将绘制在左侧子图中,右侧子图中的图2将绘制,共享相同的图例,并且在轴x和y中具有相同的比例:

这里有一些示例数据:
x = [ 1, 2, 3, 5, 10, 100, 1000 ]
y1 = [ 1, 0.822, 0.763, 0.715, 0.680, 0.648, 0.645 ]
y2 = [ 1, 0.859, 0.812, 0.774, 0.746, 0.721, 0.718 ]
import matplotlib.pyplot as plt
# mode 01 from one case
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.plot( x, y1, label='mode 01' )
# mode 01 from other case
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.plot( x, y2, label='mode 01' )
Run Code Online (Sandbox Code Playgroud)
编辑:@nordev建议的方法有效.现在将ax1和ax2对象传递给新图非常方便,因为它们有更多的信息.似乎没有直接的方法来实现这一目标. …
我想将我为一个图形设置的子图轴数据分配给另一个图形,如下所示。
import matplotlib.pyplot as plt
x = [1,2,3]
y = [1,2,3]
fig1, ax1 = plt.subplots(1,2,sharey=True)
ax1[0].plot(x,y)
ax1[0].set_xlabel("x")
ax1[0].set_ylabel("y")
fig2, ax2 = plt.subplots(4,4,sharex=True,sharey=True)
ax2[0,0] = ax1[0] # I was expecting this to set all the axis labels and plot data from ax1
plt.show()
Run Code Online (Sandbox Code Playgroud)
请注意,我在matplotlib 中看到了答案:我可以创建 AxesSubplot 对象,然后将它们添加到 Figure 实例吗?
我尝试使用fig2.axes.append(ax1)但这不起作用。我希望所有设置在ax1[0]of的属性都fig1被复制并显示在fig2
我对matplotlib有些新意.我要做的是编写代码,将几个数字保存到eps文件,然后生成一个复合图形.基本上我想做的就是有类似的东西
def my_plot_1():
fig = plt.figure()
...
return fig.
def my_plot_2():
fig = plt.figure()
...
return fig
def my_combo_plot(fig1,fig2):
fig = plt.figure()
gs = gridspec.GridSpec(2,2)
ax1 = plt.subplot(gs[0,0])
ax2 = plt.subplot(gs[0,1])
ax1 COPY fig1
ax2 COPY fig2
...
Run Code Online (Sandbox Code Playgroud)
之后我可以做点什么
my_combo_plot( my_plot_1() , my_plot_2() )
Run Code Online (Sandbox Code Playgroud)
并且拥有所有的数据和设置也会从由前两个函数返回的情节抄袭,但我无法弄清楚如何做到这一点与matplotlib来完成.
我有几个matplotlib图形对象,我想通过将它们放在另一个旁边来组合成一个大图形.
请注意,我无法更改单个数字的创建方式.我可以使用生成的Figure对象.
我在一个图/轴上有几个线条,条形图和艺术家.我想在原始图形/轴上添加不同的组件集.是否可以将原始图形/轴的所有对象复制到另一个图形/轴中,而无需通过代码重绘所有内容?
一种方法是在绘制另一组组件之前删除所有新添加的组件.但是,如果我想将几个轴放入一个图中,这将不起作用.这里已经进行了一些讨论.但它一个接一个地复制/添加所有对象,这并不比在有很多对象时重绘所有对象更好.
@Greg,非常感谢回复.如果我只绘制数据,它将很简单,只需重新绘制数据,甚至复制一些行.然而,这个数字包含了很多艺术家,也可以由用户通过GUI界面添加,或者通过动态脚本添加机器人,我可能在运行时不知道它们的类型.该图是即时生成的.当然,我可以尝试复制所有数据,记录所有艺术家类型,属性并再次重新绘制它们.但它太多了,并参与修改生成这些数字的软件.也许我可以遍历所有可能的对象做copy和add_xxx.但是,我会有一个更好的方法.
感谢@Joe Kington和他的帖子:"将轴实例添加到另一个数字".
我找到了复制轴并将轴插入子图的方法:
def test_pickleAxes():
import pickle
import numpy as npy
x = npy.arange(0,4*npy.pi,0.2)
y = npy.sin(x)
fig, ax = plt.subplots()
p = pickle.dumps(ax)
ax2 = pickle.loads(p)
ax.change_geometry(2,1,1)
ax2.change_geometry(2,1,2)
fig._axstack.add(fig._make_key(ax2), ax2)
plt.show()
Run Code Online (Sandbox Code Playgroud)
然而,在大多数情况下,到目前为止它似乎并不比blit好.这是为什么?因为轴的腌制实际上是整个图形的腌制.当解开它时,它将创建一个新的图形,并且加载的轴实例将与它相关联.甚至我们设法将轴添加到旧图中.ax2仍然只与新数字相关联.因此,当我们尝试与旧图形交互时,ax2将不会相互作用.相反,如果我们缩放/平移新数字,两个数字中的ax2将会改变.如果我们只保存svg或pdf文件,这似乎是一个相当不错的解决方案.
仍然试图找到一种方法将ax2从新图中解耦并使其与旧图相结合.
我df.hist(columns=, by=)想在GridSpec(2,2)中插入4种不同的东西.
他们每个人都是这样的:
这是代码:
stuff = [df1, df2, df4, df3]
col = ['blue', 'orange', 'grey', 'green']
fig = plt.figure(figsize=(10,10))
gs = gridspec.GridSpec(2, 2)
for i in range(0, len(stuff)):
ax = plt.subplot(gs[i])
stuff[i].hist(column='quanti_var', by=stuff[i].quali_var, alpha=.5, color=col[i], ax=ax)
Run Code Online (Sandbox Code Playgroud)
我有以下用户警告:
C:\Anaconda3\lib\site-packages\pandas\tools\plotting.py:3234: UserWarning: To output multiple subplots, the figure containing the passed axes is being cleared
"is being cleared", UserWarning)
Run Code Online (Sandbox Code Playgroud)
而不是我要找的输出:
我尝试了几件事,包括使用SubplotSpec没有成功.任何的想法 ?
谢谢你们把你的神经元借给我!
我正在尝试执行以下操作:
我使用 matplotlib 创建了一个图形,其中包含几个子图。更具体地说,2x4 子图
输出非常适合在屏幕上显示,但不适合将其保存为 pdf。
如果我只是使用save_fig,它会打印一个带有 2x4 网格的单页 pdf 文档。
我想做的是重新排列我的子图,比方说一个 2x4 网格(选择哪个子图放在哪里,会很好,但不是必需的)并将其打印到 2 页 pdf,每个 4 个子图。(为了能够适合A4页面尺寸)
这可能吗?
提前谢谢您!
我正在创建一个包含大约一百个子图/轴的图形,每个子图/轴都有几千个数据点。目前,我正在循环遍历每个子图并用于plt.scatter放置点。然而,这是相当慢的。是否可以使用多个 CPU 来加速绘图,通过将工作分配给每个子图一个核心或在单个子图中绘制数据点?
到目前为止,我尝试使用joblib并行进程来创建子图,但它不是在同一图中创建新的子图,而是为每个子图生成一个新图。我尝试过后端PDF、、Qt5Agg和Agg。这是我的代码的简化示例。
import matplotlib as mpl
mpl.use('PDF')
import seaborn as sns
import matplotlib.pyplot as plt
from joblib import Parallel, delayed
def plotter(name, df, ax):
ax.scatter(df['petal_length'], df['sepal_length'])
iris = sns.load_dataset('iris')
fig, axes = plt.subplots(3,1)
Parallel(n_jobs=2)(delayed(plotter)
(species_name, species_df, ax)
for (species_name, species_df), ax in zip(iris.groupby('species'), axes.ravel()))
fig.savefig('test.pdf')
Run Code Online (Sandbox Code Playgroud)
设置n_jobs=1有效后,所有点都将绘制在同一个图中。然而,将其增加到一以上会创建四个数字:我启动时使用一个数字plt.subplots,然后每次ax.scatter调用一个数字。
由于我将轴从第一个图形传递到plotter,所以我不确定如何/为什么创建附加图形。matplotlib 中是否有一些后备措施,如果指定的图形被另一个绘图过程“锁定”,则会导致自动创建新图形?
任何关于如何改进我当前的方法或通过替代方法实现加速的建议都将受到赞赏。
python matplotlib multiprocessing joblib python-multiprocessing
我检查了这个Matplotlib返回一个绘图对象,但它确实不适合我的问题。
我想做的是:
def func1():
fig1 = plt.plot (np.arange(0.0, 5.0, 0.1))
return fig1
def func2()
return plt.plot (np.arange(0.0, 5.0, 0.02))
fig1 = func1()
fig2 = func2()
plt.figure()
plt.add_subplot(fig1)
plt.add_subplot(fig2)
plt.show()
Run Code Online (Sandbox Code Playgroud)
上面的代码只是一个主要思想。你能建议我怎么做吗?
谢谢
我有一个返回seaborn 情节的函数。我想通过循环将多个seaborn图添加到一个图形中。我在这里找到了 matplotlib 的答案,但不知道如何将其应用于 seaborn。
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
def plotf(df_x):
g = sns.lineplot(data=df_x[['2016','2017','2018']])
g.set_xticks(range(0,12))
g.set_xticklabels(['Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan'])
return g
df = pd.DataFrame({'Period': list(range(1,13)),
'2016': np.random.randint(low=1, high=100, size=12),
'2017': np.random.randint(low=1, high=100, size=12),
'2018': np.random.randint(low=1, high=100, size=12)})
fig, ax = plt.subplots(nrows=3)
Run Code Online (Sandbox Code Playgroud)
我想看 3 个地块ax[0], ax[1], ax[2]
我有一个脚本,可从数据生成matplotlib数字。这些图将保存到磁盘,如下所示:
fig, ax = plt.subplots()
# create the plot
# ...
pickle.dump(ax, open(of, 'wb'))
在另一个脚本中,我想加入其中某些情节。我可以使用以下方式读取数据:
figures = [pickle.load(file) for file in files]
(FWIW,我读回的数字带有类型AxesSubplot。)
到目前为止,一切都很好。现在,我想使用可用图的最大或最小比例将两个(或多个)图形的数据放在一起。由于缺乏经验,我完全不知道如何实现这一目标。我确实发现了有关加入地块的问题,并且共识是首先绘制一个图形。在我的情况下,这将非常困难,因为单个数据集的绘制逻辑已经很复杂。(还有其他原因,为什么每个数据集都应首先自己绘制,然后才可能与其他数据集连接)。
我要加入的图以相同的方式表示其数据-即所有图都是线图或直方图(不确定要如何有效地连接那些图)或QQPlot(请参阅statsmodels.api)。它们可能具有或可能不具有相同的数据大小。
如何加入不同数字的地块?