- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想要一个由四个子图组成的图形。其中两个是通常的线图,其中两个是 imshow-images。
我可以将 imshow-images 格式化为正确的绘图本身,因为它们中的每一个都需要自己的颜色条、修改后的轴和删除另一个轴。然而,这似乎对子图毫无用处。谁能帮我解决这个问题?
我用它来显示上面“常规”图的数据作为颜色图(通过将输入数组 i
缩放到 [ i, i, i, i, i, i ]
用于 2D 并用它调用 imshow()
。
下面的代码首先显示了我需要的子图,第二个显示了我能做的一切,这还不够。
#!/usr/bin/env python
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
s = { 't':1, 'x':[1,2,3,4,5,6,7,8], 'D':[0.3,0.5,0.2,0.3,0.5,0.5,0.3,0.4] }
width = 40
# how I do it in just one plot
tot = []
for i in range(width):
tot.append(s['D'])
plt.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1))
plt.colorbar()
plt.axes().axes.get_xaxis().set_visible(False)
plt.yticks([0, 2, 4, 6], [s['x'][0], s['x'][2], s['x'][4], s['x'][6]])
plt.show()
f = plt.figure(figsize=(20,20))
plt.subplot(211)
plt.plot(s['x'], s['D'])
plt.ylim([0, 1])
#colorplot
sp = f.add_subplot(212)
#reshape (just necessary to see something)
tot = []
for i in range(width):
tot.append(s['D'])
sp.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1))
#what I can't do now but needs to be done:
#sp.colorbar()
#sp.axes().axes.get_xaxis().set_visible(False)
#sp.yticks([0, 200, 400, 600, 800, 1000], [s['x'][0], s['x'][200], s['x'][400], s['x'][600], s['x'][800], s['x'][1000]])
plt.show()
最佳答案
您可以使用 matplotlibs 面向对象的接口(interface)而不是状态机接口(interface),以便更好地控制每个轴。此外,要控制颜色条的高度/宽度,您可以使用 AxesGrid matplotlib 工具包。
例如:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.colors import LogNorm
from matplotlib.ticker import MultipleLocator
s = {'t': 1,
'x': [1, 2, 3, 4, 5, 6, 7, 8],
'T': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
'D': [0.3, 0.5, 0.2, 0.3, 0.5, 0.5, 0.3, 0.4]}
width = 40
tot = np.repeat(s['D'],width).reshape(len(s['D']), width)
tot2 = np.repeat(s['T'],width).reshape(len(s['D']), width)
fig, (ax1, ax2, ax3, ax4) = plt.subplots(1,4)
fig.suptitle('Title of figure', fontsize=20)
# Line plots
ax1.set_title('Title of ax1')
ax1.plot(s['x'], s['T'])
ax1.set_ylim(0,1)
ax2.set_title('Title of ax2')
ax2.plot(s['x'], s['D'])
# Set locations of ticks on y-axis (at every multiple of 0.25)
ax2.yaxis.set_major_locator(MultipleLocator(0.25))
# Set locations of ticks on x-axis (at every multiple of 2)
ax2.xaxis.set_major_locator(MultipleLocator(2))
ax2.set_ylim(0,1)
ax3.set_title('Title of ax3')
# Display image, `aspect='auto'` makes it fill the whole `axes` (ax3)
im3 = ax3.imshow(tot, norm=LogNorm(vmin=0.001, vmax=1), aspect='auto')
# Create divider for existing axes instance
divider3 = make_axes_locatable(ax3)
# Append axes to the right of ax3, with 20% width of ax3
cax3 = divider3.append_axes("right", size="20%", pad=0.05)
# Create colorbar in the appended axes
# Tick locations can be set with the kwarg `ticks`
# and the format of the ticklabels with kwarg `format`
cbar3 = plt.colorbar(im3, cax=cax3, ticks=MultipleLocator(0.2), format="%.2f")
# Remove xticks from ax3
ax3.xaxis.set_visible(False)
# Manually set ticklocations
ax3.set_yticks([0.0, 2.5, 3.14, 4.0, 5.2, 7.0])
ax4.set_title('Title of ax4')
im4 = ax4.imshow(tot2, norm=LogNorm(vmin=0.001, vmax=1), aspect='auto')
divider4 = make_axes_locatable(ax4)
cax4 = divider4.append_axes("right", size="20%", pad=0.05)
cbar4 = plt.colorbar(im4, cax=cax4)
ax4.xaxis.set_visible(False)
# Manually set ticklabels (not ticklocations, they remain unchanged)
ax4.set_yticklabels([0, 50, 30, 'foo', 'bar', 'baz'])
plt.tight_layout()
# Make space for title
plt.subplots_adjust(top=0.85)
plt.show()
您可以使用 set_ticks
和 set_ticklabels
方法更改任一轴上刻度的位置和标签,如上例所示。
关于make_axes_locatable
函数的作用,来自matplotlib site about the AxesGrid toolkit :
The axes_divider module provides a helper function make_axes_locatable, which can be useful. It takes a existing axes instance and create a divider for it.
ax = subplot(1,1,1)
divider = make_axes_locatable(ax)make_axes_locatable returns an instance of the AxesLocator class, derived from the Locator. It provides append_axes method that creates a new axes on the given side of (“top”, “right”, “bottom” and “left”) of the original axes.
关于python - 多个 imshow-subplots,每个都有颜色条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18266642/
我有点不清楚如何subplot作品。具体来说subplot(121)有什么区别和 subplot(1,2,1)在 MATLAB 中?我试图搜索 subplot文档,但我似乎找不到我要找的东西。 最佳答
我是编码方面的新手,因此也是 Python 方面的新手,所以这听起来可能很愚蠢,但是 Python 中 matplotlib 的 .subplot() 和 .subplots() 方法之间的主要区别是
def plot_it(U1, U2, x, i): fig_1, = plt.plot(x, U1) fig_2, = plt.plot(x, U2) i = str(int
有时候想要把几张图放在一起plot,比较好对比,subplot和subplots都可以实现,具体对比可以查看参考博文。这里用matplotlib库的subplot来举个栗子。 数据长什么样 有两
在matplotlib中,用subplots画子图时,有时候需要调整子图间矩,包括子图与边框的间矩,子图间上下间矩,子图间左右间矩,可以使用fig.tight_layout()函数:
如下所示: matplotlib subplots 设置总图的标题 : fig.suptitle(dname,fontsize=16,x=0.53,y=1.05,) 以上这篇matplotli
我不知道如何使用 R 和 Plotly 使表格子图正常工作。 下面演示了我的意思。我有两张图,一张散点图和一张 table 。使用 subplot 函数,表格图的行为不符合预期。 我要么在散点图上失去
我正在尝试绘制一些子图,但似乎无法共享轴。我看过其他代码,他们似乎完全按照我的尝试做,但我的似乎没有做任何事情。 我只是想在左侧的四个子图中共享各自的轴,同时将最右侧的子图分开。 import num
我想在子图的底部添加一个图例(2 x 2): 正如您所看到的,由于我手动调整了第二行中的图表,因此被挤压了一点。 是否有像 sublegend(...) 这样的函数,或者它是否涉及大量编码? 来源 这
在使用 Matplotlib 绘图时,我们大多数情况下,需要将一张画布划分为若干个子区域,之后,我们就可以在这些区域上绘制不用的图形。在本节,我们将学习如何在同一画布上绘制多个子图。 matplotl
matplotlib.pyplot模块提供了一个 subplots() 函数,它的使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建
使用 plotly 的 subplots() 时,如何删除图例中的重复项? 这是我的 MWE: library(plotly) library(ggplot2) library(tidyr) mpg
如何调整某些子图之间的空白?在下面的示例中,假设我想消除第 1 个和第 2 个子图之间以及第 3 个和第 4 个之间的所有空白,并增加第 2 个和第 3 个之间的空间? import matplotl
如果我绘制如下所示的单个图表,其大小将为 (x * y)。 import matplotlib.pyplot as plt plt.plot([1, 2], [1, 2]) 但是,如果我在同一行中绘制
我需要在网格中显示20张图像,我的代码如下 def plot_matric_demo(img, nrows, ncols): fig, ax = plt.subplots(nrows=nrow
这个问题在这里已经有了答案: How to plot in multiple subplots (12 个答案) 关闭去年。 我在一些帮助下构建了一组饼图 Insert image into pie
我正在寻找一种方法来创建一个包含多个子图的绘图 fig, (ax0, ax1) = plt.subplots(nrows=2, sharex=True) 会在 matplotlib 中执行,然后可以通
当我使用 PyPlot 的 figure() 函数创建单个绘图时,我可以使用字符串作为参数来设置出现窗口的名称: import matplotlib.pyplot as plt figure = pl
我想要一个由四个子图组成的图形。其中两个是通常的线图,其中两个是 imshow-images。 我可以将 imshow-images 格式化为正确的绘图本身,因为它们中的每一个都需要自己的颜色条、修改
我在使用 plt.subplots 时尝试更改图形大小时遇到了一些麻烦。使用下面的代码,我只得到标准尺寸的图表,其中包含我所有的子图(大约有 100 个),并且显然只是一个额外的空 figures
我是一名优秀的程序员,十分优秀!