Очень хороший вопрос.df.plot
- это оболочка для нескольких функций построения графиков в matplotlib.Для kind="scatter"
будет вызываться функция scatter
matplotlib.Большинство аргументов df.plot()
сначала преобразуются в данные внутри Series
, которые вы получаете из столбца данных соответствующего имени.
Например,
df.plot(x="lon", y="lat")
будет преобразовано в
ax.scatter(x=df["lon"].values, y=df["lat"].values)
Остальные аргументы передаются в Scatter, следовательно,
df.plot(x="lon", y="lat", some_argument_pandas_doesnt_know=True)
приведет к
ax.scatter(x=df["lon"].values, y=df["lat"].values, some_argument_pandas_doesnt_know=True)
Таким образом, хотя pandas преобразует th аргументы x
, y
, c
, для s
это не так.Следовательно, s
просто передается в ax.scatter
, но эта функция matplotlib не знает, что будет означать какая-то строка типа "population"
.
Для аргументов, передаваемых в функцию matplotlib, нужно придерживатьсяПодпись matplotlib и в случае s
предоставляют данные напрямую.
Обратите внимание, однако, что сам разброс matplotlib также позволяет использовать строки в качестве аргументов.Однако для этого необходимо указать, из какого набора данных они должны быть взяты.Это делается с помощью аргумента data
.Следовательно, следующее работает хорошо и будет matplotlib эквивалентным вызову панд в вопросе:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np; np.random.seed(42)
df = pd.DataFrame(np.random.rand(20,2), columns=["lon", "lat"])
df["pop"] = np.random.randint(5,300,size=20)
df["med"] = np.random.rand(20)*1e5
fig, ax = plt.subplots(figsize=(10,7))
sc = ax.scatter(x = "lon", y = "lat", alpha = 0.4,
s = "pop", label = "population" ,
c = "med" , cmap = "jet", data=df)
fig.colorbar(sc, label="med")
ax.set(xlabel="longitude", ylabel="latitude")
plt.show()
Наконец, вы можете теперь спросить, не будет ли в равной степени возможна подача данных в matplotlib через аргумент data
проходя через пандуК сожалению, нет, потому что pandas использует data
в качестве аргумента внутри себя, так что он не будет пропущен.Поэтому у вас есть два варианта:
- Используйте pandas, как в вопросе, и поставьте сами данные через аргумент
s
вместо имени столбца. - Используйте matplotlib, как показано здесь, ииспользуйте имена столбцов для всех аргументов.(Или используйте сами данные, которые вы чаще всего видите при просмотре кода matplotlib.)