我正在尝试生成这样的图,该图结合了笛卡尔散布图和极坐标直方图。 (径向线可选) 存在类似的解决方案(通过Nicolas Legrand)来查看x和y中的差异(code here),但是我们需要查看 ratios (即x / y)。
更具体地说,当我们要查看相对风险度量(两个概率之比)时,这很有用。
单独使用散点图显然不是问题,但是极坐标直方图更高级。
我发现的最有希望的线索是来自matplotlib画廊here的中心示例
我尝试这样做,但是遇到了matplotlib技能的限制。为实现这一目标而进行的任何努力都是伟大的。
答案 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])
缺少轴标签和一些美化功能,但这可能是一个起点。希望对您有所帮助。
答案 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()
答案 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]
感谢指针!