【问题标题】:Python matplotlib - Combine categorical background along with scatter plotPython matplotlib - 将分类背景与散点图结合起来
【发布时间】:2021-04-03 23:34:54
【问题描述】:

我正在尝试在 Python 中找出一个正确的库来创建一个看起来像这样的复杂图:

情节背景根据X和Y的条件分为3个区域(黄色、红色、绿色)。例如:

  • 对于绿色区域:(X<=1Y<=1)或(X<0.5
  • 对于黄色区域:(0.5<X<1 and Y>1) OR (1<X<1.5 and 1<Y<3) OR (1.5<X<2 and Y<2) 红色区域也是如此......

这些条件在我的整个申请过程中保持不变。 我在 csv 文件中有坐标,并且知道如何绘制散点图。但是由于背景颜色代码,我被卡住了。

是否有一个 Python 库可以用来绘制散点图以及后面的这些网格颜色。我检查了许多网站和问题,但遗憾的是没有发现任何有用/相关的内容。

感谢任何建议/帮助。

【问题讨论】:

  • 请为您的代码提供示例输入、预期输出、实际输出,以及这与您的预期有何不同。我建议再读一遍How to create a Minimal, Reproducible Example
  • 你可以使用ax.axvspanpatches.Rectangle((1,3), 1, 4, color="red", alpha=0.50)

标签: python matplotlib plot data-visualization


【解决方案1】:

您可以将 matplotlib 的 imshow() 与 2D 数组一起使用。可以使用np.meshgrid() 创建二维数组的坐标。这些坐标将是每个网格单元的左下角。他们可以寻址到二维数组,例如与[((X < 1) & (Y < 1)) | (X < 0.5)]。在适当的位置用012 填充二维数组可以创建背景。

Matplotlib 的 scatter() 将放置散点。

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.ticker import MultipleLocator
import numpy as np

xvals = np.random.uniform(0, 3, 50)
yvals = np.random.uniform(0, 4.2, 50)
X1d = np.arange(0, 3.0001, 0.25)
Y1d = np.arange(0, 4.2001, 0.20)
X, Y = np.meshgrid(X1d, Y1d)
backgr = np.full_like(X, 2)
backgr[((X < 1.5) & (Y < 3)) | ((X < 2) & (Y < 2)) | (X < 1)] = 1
backgr[((X < 1) & (Y < 1)) | (X < 0.5)] = 0
fig, ax = plt.subplots()
ax.scatter(xvals, yvals, color='black')
cmap = ListedColormap(['lime', 'gold', 'crimson'])
ax.imshow(backgr[:-1, :-1], cmap=cmap, alpha=0.2, extent=[0, X1d[-1], 0, Y1d[-1]], origin='lower', aspect='auto')
ax.set_xticks(X1d, minor=True)
ax.set_yticks(Y1d, minor=True)
ax.xaxis.set_major_locator(MultipleLocator(1))
ax.yaxis.set_major_locator(MultipleLocator(1))
ax.grid(True, which='both', lw=1, ls=':', color='black')
plt.show()

【讨论】:

  • 非常感谢您的及时回复!它解决了我的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多