作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在绘制一些包含大量数据点的散点图。在某些时候,一半的图只是纯色,您无法很好地看到密度。所以我想将数据“投影”到轴上并显示直方图。
我写了一个小函数来做到这一点。对于轴 ax
上的绘图,它绘制 pandas DataFrame frame
的字段 column_x
与 column_y
。如果给出了one_track_frame,它也会绘制在其之上。要添加标题和标签等,可以使用 ax
对象作为参数传递 lambda
。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import pandas as pd
def projection_plot(ax, frame, column_x, column_y, frame_one_track=None, commands=None, bins=100):
ax.scatter(frame[column_x], frame[column_y], label="one track", marker='x')
divider = make_axes_locatable(ax)
ax_hist_x = divider.append_axes("top", 1.2, pad=0.1, sharex=ax)
for tl in ax_hist_x.get_xticklabels():
tl.set_visible(False)
ax_hist_x.hist(frame[column_x], bins=50)
ax_hist_y = divider.append_axes("right", 1.2, pad=0.1, sharey=ax)
for tl in ax_hist_y.get_yticklabels():
tl.set_visible(False)
ax_hist_y.hist(frame[column_y], orientation='horizontal', bins=bins)
if frame_one_track is not None:
ax.scatter(frame_one_track[column_x], frame_one_track[column_y], label="two tracks", marker='.')
ax_hist_x.hist(frame_one_track[column_x], bins=bins)
ax_hist_y.hist(frame_one_track[column_y], orientation='horizontal', bins=bins)
if commands is not None:
commands(ax)
如果我现在绘制一些随机数据,一切看起来都很好并且符合预期。
df = pd.DataFrame(np.random.randn(1000, 3)*1000, columns=["a", "b", "c"])
cut = df["c"] < 20
frame1 = df[cut]
frame2 = df[~cut]
plt.figure(figsize=(6,6))
projection_plot(plt.subplot(), frame1, "a", "b", frame2, commands=lambda ax: (
ax.legend(),
ax.set_title("Random Values", y=1.4),
ax.set_xlabel("column 0"),
ax.set_ylabel("column 1")))
如果我现在尝试将任一(或两个)轴的刻度设置为 log
,某些内容会中断并且绘图将变得不可读:
plt.figure(figsize=(6,6))
projection_plot(plt.subplot(), frame1, "a", "b", frame2, commands=lambda ax: (
ax.legend(),
ax.set_yscale('log'),
ax.set_title("Random Values", y=1.4),
ax.set_xlabel("column 0"),
ax.set_ylabel("column 1")))
在我的一些数据集中,它似乎工作正常,而对于其他数据集,它就像随机数据一样崩溃。我该如何解决这个问题?
另外:由于我对 Python 比较陌生,这种编码风格好吗?传递多行 lambda 进行进一步配置?我感觉 Ruby block 毁了我……
最佳答案
我不太清楚失败的原因,我可以想象问题与范围低于 0 的数据有关,而未定义对数刻度。
在任何情况下,您都需要手动设置绘图的限制,
ax.set_yscale('log')
ax.set_ylim(1,None)
您可能想使用 symlog
比例来代替。
ax.set_yscale('symlog')
在这种情况下,无需进行限制调整。
关于python - matplotlib:具有对数刻度的共享轴上不可读的散点图和直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49268558/
我是一名优秀的程序员,十分优秀!