我正在用 绘制 X 图twinx,并且我想设置zorder这些轴的 :
import matplotlib.pyplot as plt
import numpy as np
from pandas import plotting
x1 = np.linspace(1,20,10)
y1 = np.random.random_integers(1,20,10)
y2 = np.random.random_integers(1,20,10)
y3 = np.random.random_integers(1,20,10)
fig,ax = plt.subplots()
bx = ax.twinx()
cx = ax.twinx()
colors = getattr(getattr(plotting, '_style'), '_get_standard_colors')
(num_colors=5)
ax.plot(x1,y1, label = "1",color= colors[0])
bx.plot(x1,y2, label = "2",color= colors[1])
cx.plot(x1,y3, label = "3",color= colors[2])
cx.spines["right"].set_position(("axes", 1.1))
li,la = ax.get_legend_handles_labels()
li2,la2 = bx.get_legend_handles_labels()
li3,la3 = cx.get_legend_handles_labels()
lines= li+li2+li3
labels = la+la2+la3
ax.legend(lines, …Run Code Online (Sandbox Code Playgroud) 我一直在玩 plt.legend() 和 ax.legend() 以及来自seaborn本身的图例,我想我错过了一些东西。
我的第一个问题是,有人可以向我解释一下它们是如何结合在一起的,它们是如何工作的,如果我有次要情节,什么比什么更好?意思是我可以设置一个一般定义(例如,在此位置的所有子图中都有这个图例),然后为特定子图覆盖这个定义(例如通过 ax.legend() )?
我的第二个问题很实际,也展示了我的问题。我们以seaborn Smokers数据集来说明一下:
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
# define sizes for labels, ticks, text, ...
# as defined here /sf/ask/272998631/
SMALL_SIZE = 10
MEDIUM_SIZE = 14
BIGGER_SIZE = 18
plt.rc('font', size=SMALL_SIZE) # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE) # fontsize of the axes title
plt.rc('axes', labelsize=BIGGER_SIZE) # fontsize of the x and y labels
plt.rc('xtick', labelsize=MEDIUM_SIZE) # fontsize of the tick labels
plt.rc('ytick', labelsize=MEDIUM_SIZE) # fontsize …Run Code Online (Sandbox Code Playgroud) 虽然删除 matplotlib 子图/轴似乎很容易,例如delaxes:
fig, ax = plt.subplots(3,1, sharex=True)
for ii in range(3):
ax[ii].plot(arange(10), 2*arange(10))
fig.delaxes(ax[1])
Run Code Online (Sandbox Code Playgroud)
这将始终留下空白在删除的子图/轴的位置
所提出的解决方案似乎都无法解决此问题: Delete a subplot Clearing a subplot in Matplotlib
有没有一种方法可以在显示或保存子图之前基本上挤压子图并删除空白?
我基本上正在寻找将剩余的子图转移到“密集”网格中的最简单方法,以便以前的子图没有空白,可能比重新创建新的(子)图更好。
我试图在子图中显示与数据框df中每列相对应的所有箱线图。
我已阅读这个问题: Subplot for seaborn boxplot 并尝试实现给定的解决方案:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
d = {'col1': [1, 2, 5.5, 100], 'col2': [3, 4, 0.2, 3], 'col3': [1, 4, 6, 30], 'col4': [2, 24, 0.2, 13], 'col5': [9, 84, 0.9, 3]}
df = pd.DataFrame(data=d)
names = list(df.columns)
f, axes = plt.subplots(round(len(names)/3), 3)
y = 0;
for name in names:
sns.boxplot(x= df[name], ax=axes[y])
y = y …Run Code Online (Sandbox Code Playgroud) 我尝试根据与相应facet_wrap 图中相同的数据,将直方图splot 添加到facet_wrap 图的每个部分geom_sf 图。
我通过谷歌找到了一些方法,但到目前为止还没有具体的方法。
我之前的做法:
library(sf)
library(ggplot2)
nc <- st_read(system.file("shape/nc.shp", package="sf"))
nc <- rbind(nc, nc[rep(1:100, 3), ])
nc <- nc[order(nc$NAME),]
nc$GROUP <- c("A", "B", "C", "D")
nc$VALUE <- runif(400, min=0, max=10)
main <- ggplot() +
geom_sf(data = nc,
aes(fill = VALUE),
color = NA) +
scale_fill_gradientn(colours = c("#f3ff2c", "#96ffea", "#00429d"),
guide = "colorbar") +
coord_sf(datum = NA) +
theme(panel.background = element_blank(),
strip.background = element_blank(),) +
facet_wrap(~ GROUP, nrow = 2)
sub <- ggplot(nc, aes(x=VALUE)) +
geom_histogram(binwidth = 1) …Run Code Online (Sandbox Code Playgroud) 我正在尝试绘制一个包含两个子图、一个seaborn 热图和简单的matplotlib 线的图形。然而,当共享两个图的 x 轴时,它们没有对齐,如下图所示:
看起来问题与这篇文章类似,但是在显示时ax[0].get_xticks()我ax[1].get_xticks()得到了相同的位置,所以我不知道要更改什么。在我的图片中,偏差似乎超过 0.5。
我究竟做错了什么?
我用来绘制该图的代码如下:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
M_1=np.random.random((15,15))
M_2=np.random.random((15,15))
L_1=np.random.random(15)
L_2=np.random.random(15)
x=range(15)
cmap = sns.color_palette("hot", 100)
sns.set(style="white")
fig, ax = plt.subplots(2, 1, sharex='col', figsize=(10, 12))
ax[0].plot(x,L_1,'-', marker='o',color='tab:orange')
sns.heatmap(M_1, cmap=cmap, vmax=np.max(M_1), center=np.max(M_1)/2., square=False, ax=ax[1])
Run Code Online (Sandbox Code Playgroud) 我正在按照本教程水平制作两个子图。根据示例,以下内容应该有效。
import matplotlib.pylab as plt
import numpy
# Sample data
x = numpy.linspace(0, 2 * numpy.pi, 400)
y1 = numpy.sin(x ** 2)
y2 = numpy.cos(x ** 2)
figure, axes = plt.subplots(1, 2)
axes[0, 0].plot(x, y)
axes[0, 1].plot(x, y)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到以下错误消息。
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-4-124cb6e8d977> in <module>
8
9 figure, axes = plt.subplots(1, 2)
---> 10 axes[0, 0].plot(x, y)
11 axes[0, 1].plot(x, y)
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed …Run Code Online (Sandbox Code Playgroud) 我知道如何使用 gridspec 或 subplots_adjust 设置图形内子图的相对大小,并且我知道如何使用 Figsize 设置图形的大小。我的问题是设置子图的绝对大小。
用例:我正在制作两个单独的图,它们将保存为学术论文的 pdf 格式。一种有两个子图,一种有三个子图(两种情况都在 1 行中)。我需要 5 个子图中的每一个都具有完全相同的大小,并且在生成的 PDF 中具有完全相同的字体大小(轴标签、刻度标签等)。在下面的示例中,字体大小相同,但子图却不同。如果我使生成的 PDF 的高度相同(因此轴也相同),则 3-subplots.pdf 上的字体将小于 2-subplots.pdf 的字体。
微量元素:
import matplotlib.pyplot as plt
subplots = [2, 3]
for i, cols in enumerate(subplots):
fig, ax = plt.subplots(1, cols, sharey=True, subplot_kw=dict(box_aspect=1))
for j in range(cols):
ax[j].set_title(f'plot {j*cols}')
ax[j].set_xlabel('My x label')
ax[0].set_ylabel('My y label')
plt.tight_layout()
plt.savefig(f'{cols}-subplots.pdf', bbox_inches='tight', pad_inches=0)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我正在制作一个总共68个子图的数字,并希望删除它们之间的空白区域.这就是我所拥有的:
.
我该怎么做呢?
编辑:使用plt.tight_layout()会使情况变得更糟:

这是我的代码:
for j in range(0,len(sort_yf)):
for i in range(0,len(yf)):
if yf[i]==sort_yf[j]:
sort_ID=np.append(sort_ID,'output/'+ID[i]+'.png')
for i in range (1,69):
plt.subplot(17,4,i,aspect='equal')
plots=img.imread(sort_ID[i])
plt.imshow(plots)
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud) 我必须在图中用子图绘制不同的图形,但我不知道将绘制多少图形,因为它取决于用户引入的数据(for loop).为了绘制子图,我需要知道列数和行数.在matlab中是否有任何选项可以让matlab配置最佳数量的列和行来显示知道要完成的总子图的情节?我的意思是subplot(a,b,c)=>最佳a,b组合知道c.
现在我要求用户引入列数和行数,但这有点让人不舒服.也许一个将总子图分解为2个最等等因子的算法应该可行,但我认为编码很难.如果它太复杂了我会按照自己的方式跟进,但我很好奇.