matplotlib中的散点图和组合极坐标直方图

时间:2020-06-18 18:49:05

标签: python matplotlib

我正在尝试生成这样的图,该图结合了笛卡尔散布图和极坐标直方图。 (径向线可选) enter image description here 存在类似的解决方案(通过Nicolas Legrand)来查看x和y中的差异code here),但是我们需要查看 ratios (即x / y)。 enter image description here

更具体地说,当我们要查看相对风险度量(两个概率之比)时,这很有用。

单独使用散点图显然不是问题,但是极坐标直方图更高级。

我发现的最有希望的线索是来自matplotlib画廊here的中心示例 enter image description here

我尝试这样做,但是遇到了matplotlib技能的限制。为实现这一目标而进行的任何努力都是伟大的。

3 个答案:

答案 0 :(得分:4)

我敢肯定其他人会提供更好的建议,但是一种可以得到想要的东西的方法(不需要额外的轴画家)是使用带有散点图和条形图的极坐标投影一起绘制图表。像

import matplotlib.pyplot as plt
import numpy as np

x = np.random.uniform(size=100)
y = np.random.uniform(size=100)

r = np.sqrt(x**2 + y**2)
phi = np.arctan2(y, x)

h, b = np.histogram(phi, bins=np.linspace(0, np.pi/2, 21), density=True)
colors = plt.cm.Spectral(h / h.max())

ax = plt.subplot(111, projection='polar')
ax.scatter(phi, r, marker='.')
ax.bar(b[:-1], h, width=b[1:] - b[:-1], 
       align='edge', bottom=np.max(r) + 0.2,  color=colors)
# Cut off at 90 degrees
ax.set_thetamax(90)
# Set the r grid to cover the scatter plot
ax.set_rgrids([0, 0.5, 1])
# Let's put a line at 1 assuming we want a ratio of some sort
ax.set_thetagrids([45], [1])

这将给 enter image description here

缺少轴标签和一些美化功能,但这可能是一个起点。希望对您有所帮助。

答案 1 :(得分:2)

您可以在彼此顶部使用两个轴:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(6,6))
ax1 = fig.add_axes([0.1,0.1,.8,.8], label="cartesian")
ax2 = fig.add_axes([0.1,0.1,.8,.8], projection="polar", label="polar")

ax2.set_rorigin(-1)
ax2.set_thetamax(90)
plt.show()

enter image description here

答案 2 :(得分:0)

好的。感谢Nicolas的answer和tomjn的answer,我有了一个可行的解决方案:)

data My a b = Constr Int a String b Double deriving (Show)
instance (Typeable a, Typeable b) => Data (My a b) where
  gfoldl k z (Constr x1 a x2 b x3)
    = z go `k` x1 `k` x2 `k` x3
    where go y1 y2 y3 = Constr y1 a y2 b y3
  gunfold k z _ = k . k . k . z $ go
    where go y1 y2 y3 = Constr y1 undefined y2 undefined y3
  toConstr _ = con
  dataTypeOf _ = ty
con = mkConstr ty "Constr" [] Prefix
ty = mkDataType "Mod.My" [con]

感谢指针!

enter image description here