gpt4 book ai didi

python - matplotlib:具有对数刻度的共享轴上不可读的散点图和直方图

转载 作者:行者123 更新时间:2023-12-01 02:03:51 26 4
gpt4 key购买 nike

我正在绘制一些包含大量数据点的散点图。在某些时候,一半的图只是纯色,您无法很好地看到密度。所以我想将数据“投影”到轴上并显示直方图。

我写了一个小函数来做到这一点。对于轴 ax 上的绘图,它绘制 pandas DataFrame frame 的字段 column_xcolumn_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")))

correct plot

如果我现在尝试将任一(或两个)轴的刻度设置为 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")))

broken plot

在我的一些数据集中,它似乎工作正常,而对于其他数据集,它就像随机数据一样崩溃。我该如何解决这个问题?

另外:由于我对 Python 比较陌生,这种编码风格好吗?传递多行 lambda 进行进一步配置?我感觉 Ruby block 毁了我……

最佳答案

我不太清楚失败的原因,我可以想象问题与范围低于 0 的数据有关,而未定义对数刻度。

在任何情况下,您都需要手动设置绘图的限制,

ax.set_yscale('log')
ax.set_ylim(1,None)

enter image description here

您可能想使用 symlog 比例来代替。

ax.set_yscale('symlog')

在这种情况下,无需进行限制调整。

enter image description here

关于python - matplotlib:具有对数刻度的共享轴上不可读的散点图和直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49268558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com